1. 程式人生 > >hdu 2203

hdu 2203

color get nbsp cstring ext str set kmp 循環

題意:給兩個字符串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+

1;
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
j=next[j];
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
printf("no\n");
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}

return
0;
}

hdu 2203