链接:http://acm.hdu.edu.cn/showproblem.php?pid=2203
分析:把s1拼接的本串的串尾,进行kmp即可。(字符串处理函数要熟练使用啊。。。)以下给出两种解法。
Source Code:
(KMP):
#include<stdio.h>
#include<string.h>
#define maxn 100010
int next[maxn];
char s1[maxn],s2[maxn],s[maxn<<1];
void getnext(){
int j=0,k=-1;
next[0]=-1;
int len=strlen(s2);
while(j<len){
if(k==-1||s2[j]==s2[k]){
k++,j++;
if(s2[j]!=s2[k]) next[j]=k;
else next[j]=next[k];
}
else k=next[k];
}
}
bool KMP(){
int i=0,j=0;
int len=strlen(s);
int len2=strlen(s2);
getnext();
while(i<len){
if(s[i]==s2[j]||j==-1){
i++;j++;
if(j==len2) return true;
}
else j=next[j];
}
return false;
}
int main()
{
while(gets(s1)!=NULL){
gets(s2);
strcpy(s,s1);
strcat(s,s1);
if(KMP()) printf("yes\n");
else printf("no\n");
}
return 0;
}
字符串处理函数strstr()应用。
#include<stdio.h>
#include<string.h>
#define maxn 100010
char s1[maxn],s2[maxn],s[maxn<<1];
int main()
{
while(gets(s1)!=NULL){
gets(s2);
strcpy(s,s1);
strcat(s,s1);
if(strstr(s,s2)==NULL) puts("no");
else puts("yes");
}
return 0;
}