处理环的方法:把链上的元素向后复制一遍。
#include <bits/stdc++.h>
using namespace std;
char a1[200010], b1[100010];
int f[100010];
int main(){
while(scanf("%s%s", a1+1, b1+1) != EOF){
int len1 = strlen(a1+1)*2, len2 = strlen(b1+1);
if(len1/2 < len2){
printf("no\n");
continue;
}
for(int i = len1/2+1; i <= len1; i ++)
a1[i] = a1[i-len1/2];
for(int i = 1; i <= len2; i ++) f[i] = 0;
int p = 0, flag = 0;
for(int i = 2; i <= len2; i ++){
while(p > 0 && b1[p+1] != b1[i]) p = f[p];
if(b1[p+1] == b1[i]) p ++;
f[i] = p;
}
p = 0;
for(int i = 1; i <= len1; i ++){
while(p > 0 && b1[p+1] != a1[i]) p = f[p];
if(b1[p+1] == a1[i]) p ++;
if(p == len2){
printf("yes\n");
flag = 1;
break;
}
}
if(!flag) printf("no\n");
}
return 0;
}