亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
-
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int Next[100011];
char s1[100011];
char s2[100011];
void GetNext(char *s,int len)
{
Next[0]=-1;
int i;
int j=-1;
while (i<len)
{
if(j==-1 || s[i]==s[j])
{
i++;
j++;
if(s[i]==s[j])
Next[i]=Next[j];
else
Next[i]=j;
}
else
j=Next[j];
}
}
bool kmp(char *s1,int len1,char *s2,int len2)
{
int i=0;
int j=0;
while (i<len1 && j<len2)
{
if(s1[i]==s2[j]|| j==-1)
{
i++;
j++;
}
else
j=Next[j];
}
if(j==len2)
return true;
return false;
}
int main()
{
int len1,len2;
while (scanf("%s",s1)!=EOF)
{
getchar();
scanf("%s",s2);
len1=strlen(s1);
len2=strlen(s2);
if(len2>len1) //这种情况肯定不行
{
puts("no");
continue;
}
for (int i=len1,j=0; i<2*len1; i++,j++)
s1[i]=s1[j];
s1[2*len1]='\0';
GetNext(s2, len2);
printf(kmp(s1,2*len1, s2, len2)?"yes\n":"no\n");
}
return 0;
}