题目:
思路:
因为此题后面的字符与前缀字符串组成的字符串也可以进行判断,所以首先想到的最简单的方法是将要判断的字符串*2,这样就可以套用KMP算法了。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1e5+5;
char a[maxn],b[maxn];
int p[maxn];
int lena,lenb;
string A;
void prefix_table()
{
p[0]=0;
int i=1;
int len=0;
while (i<lenb)
{
if(b[i]==b[len])
{
len++;
p[i]=len;
i++;
}
else
{
if(len>0)
{
len=p[len-1];
}
else
{
p[i]=0;
i++;
}
}
}
for (int i=lenb-1;i>0;i--)
p[i]=p[i-1];
p[0]=-1;
}
int Judge()
{
int i=0,j=0;
while (i<lena*2)
{
if(j==lenb-1&&b[j]==A[i])
{
return 1;
}
if(A[i]==b[j])
{
i++;j++;
}
else
{
j=p[j];
if(j==-1)
{
j++;i++;
}
}
}
return 0;
}
int main()
{
while (gets(a))
{
gets(b);
lena=strlen(a);
lenb=strlen(b);
if(lena<lenb)
{
printf("no\n");
continue;
}
A=a;
A+=A;
prefix_table();
if(Judge())
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}