今天看 kmp 所以就做了亲和串一直在想怎么循环那个s1串啊原来是在加上一个它本身就是连在一起的作用
#include<stdio.h>
#include<string.h>
int next[100005],n,m;
char a[200010],b[100005];
void getnext()
{
int i,j=0;
next[1]=0;
for(i=2;i<=m;i++)
{
while(j>0&&b[i]!=b[j+1])
j=next[j];
if(b[i]==b[j+1])
j+=1;
next[i]=j;
}
}
int kmp()
{
int i,j=0;
for(i=1;i<=n;i++)
{
while(j>0&&a[i]!=b[j+1])
j=next[j];
if(a[i]==b[j+1])
j++;
if(j==m)
return i-m+1;
//j = next[j];
}
return 0;
}
int main()
{
int t,i,j;
while(scanf("%s%s",a+1,b+1)!=EOF)
{
memset(next,0,sizeof(next));
n=strlen(a+1);
m=strlen(b+1);
for(i=1;i<=n;i++)
a[i+n]=a[i]; //循环可以把s1重复两遍那样头尾就结合起来了
n*=2;
if(n<m)
puts("no");
getnext();
if(!kmp())
puts("no");
else
puts("yes");
}
return 0;
}
。