原题:http://acm.hdu.edu.cn/showproblem.php?pid=2203
思路:
将T串扩增成TT串,就相当于循环移位了一周;
#include<stdio.h>
#include<string.h>
const int maxn = 100005;
char T[maxn*2], P[maxn];
int f[maxn], n, m;
bool find()
{
int j = 0;
for(int i = 0;i<n*2;i++)
{
while(j && T[i]!=P[j]) j = f[j];
if(T[i] == P[j]) j++;
if(j == m)
return true;
}
return false;
}
void getFail()
{
f[0] = f[1] = 0;
for(int i = 1;i<m;i++)
{
int j = f[i];
while(j && P[i]!=P[j]) j=f[j];
if(P[i] == P[j])
f[i+1] = j+1;
else
f[i+1] = 0;
}
}
int main()
{
while(scanf("%s%s", T, P)!=EOF)
{
n = strlen(T);
m = strlen(P);
if(n<m)
{
printf("no\n");
continue;
}
for(int i = n;i<n*2;i++)
T[i] = T[i-n];
T[2*n] = 0;
getFail();
if(find())
printf("yes\n");
else
printf("no\n");
}
return 0;
}