题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2203
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
/*************************************************************************************************************
不知道什么原因 wa 了一下午,最后换了个模板 AC 了,以后就用这个模板,忘记之前的模板吧。
值得注意一点的是输入:
1,C++果断 tel; 所以采用 C 的输入。
2,别一次两个字符串都输入,先输入一个到 EOF,在输入另一个,亲测如果同时输入会超时
*************************************************************************************************************/
int Next[100005];
char s[100005*2],p[100005];
void getNext(int m){
int i=0,j=-1;
Next[0]=-1;
while(i < m){
if(j == -1 || p[i] == p[j])
Next[++i] = ++j;
else
j=Next[j];
}
}
bool Kmp(int n,int m){
getNext(m);
int i = 0,j = 0;
while(i < n && j < m){
if(j == -1 || s[i] == p[j]){
i++;
j++;
}
else
j=Next[j];
}
if(j >= m) return true;
else
return false;
}
int main()
{
while(scanf("%s",&s) != EOF){
scanf("%s",&p);
int lt1=strlen(s),lt2=strlen(p);
if(lt1 < lt2) { cout<<"no"<<endl; continue;}
strncpy(s+lt1,s,lt1);
if(Kmp(lt1*2,lt2))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}