题意就是两个串s1,s2,如果s2是s1的子串就输出yes,不然输出no,而且s1从尾部到头部循环过来也算。就比如样例中的AABCD 和 CDAA,这样也算匹配成功。
思路:用KMP算法查找子串就可以了,事先把s1自我复制一遍,就比如AABCD,把它复制成AABCDAABCD,再当作主串去比较就可以了。貌似c++有个函数strstr()
可以直接匹配子串欸。
#include<stdio.h>
#include<string.h>
#include<cstring>
#define val 100005
int lens,lenp,next[val];
char s[val*2],p[val];
void GetNext() //求Next数组
{
int j,k;
j=0,k=-1;
next[j]=k;
while(j<lenp)
{
if(k==-1||p[j]==p[k])
{
k++;
j++;
next[j]=k;
}
else k=next[k]; //KMP算法中最难懂的一步
}
}
int kmp()
{
int i,j;
i=j=0;
GetNext();
while(i<lens&&j<lenp)
{
if(j==-1||s[i]==p[j])
{
i++;
j++;
}
else j=next[j];
}
if(j<lenp) return 0;
else return 1;
}
int main()
{
while(scanf("%s",s)!=EOF)
{
scanf("%s",&p);
lens=strlen(s);
lenp=strlen(p);
strncpy(s+lens,s,lens); //自我复制
lens*=2;
if(kmp()) printf("yes\n");
else printf("no\n");
}
return 0;
}