hdu 2203
題意:給兩個字符串s1與s2,讓s1循環移位看s2能否能成為s1的子串。
題解:讓s1增長一倍,看s2是否是s1的子串。
代碼:
#include <cstdio>
#include <cstring>
int next[110000];
char a[210000],b[110000];
void Get_next(int *next,char *str){
int i,j;
i=0;
j=next[i]=-1;
while(i<strlen(str)){
if(j==-1||str[i]==str[j]){
next[i+1]=j+
i++;
j++;
}
else j=next[j];
}
}
bool kmp(int *next,char *str1,char *str2){
int i,j;
i=j=0;
int last;
int len1=strlen(str1),len2=strlen(str2);
while(i<len1){
if(j==-1||str1[i]==str2[j]){
i++;
j++;
}
else
if(j==len2) return true;
}
return false;
}
int main(){
while(scanf("%s%s",a,b)!=EOF){
int n=strlen(a);
memset(next,0,sizeof(next));
Get_next(next,b);
for(int i=0;i<n;i++) a[n+i]=a[i];
if(kmp(next,a,b)) printf("yes\n");
else
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
return 0;
}
hdu 2203