#include<stdio.h>
#include<string.h>
int next[100010];
char son[100010], fat[300010], flag[100010];
void getnext(){
int q, k;
int m = strlen(son);
next[0] = 0;
for(q = 1, k = 0; q < m; q++){
while(k > 0 && son[q] != son[k]){
k = next[k - 1];
//printf("%d %d\n", next[k - 1], k);
}
if(son[q] == son[k]){
k++;
}
next[q] = k;
}
}
int KMP(){
int i = 0, j, k;
int sonLen = strlen(son);
int fatLen = strlen(fat);
while(i <= fatLen - sonLen){
k = 0;
while(son[0] != fat[i]){
i++;
}
if(son[0] == fat[i]){
for(j = 0; j < sonLen; j++){
if(son[j] == fat[i + j]){
k++;
}
else{
break;
}
}
if(k == sonLen){
return 1;
}else{
i += k - next[k - 1];
}
}
}
return 0;
}
int main(){
while(gets(fat)){
int i, lenfat, lenson, lenflag;
lenfat = strlen(fat);
gets(son);
lenson = strlen(son);
getnext();
strcpy(flag, fat);
lenflag = strlen(flag);
while(lenfat <= lenson){
strcat(fat, flag);
lenfat += lenflag;
}
strcat(fat, flag);
lenfat += lenflag;
if(KMP()){
printf("yes\n");
}
else{
printf("no\n");
}
}
return 0;
}
KMP hdu2203
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.