hdu 2203
Posted LMissher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 2203相关的知识,希望对你有一定的参考价值。
题意:给两个字符串s1与s2,让s1循环移位看s2能否能成为s1的子串。
题解:让s1增长一倍,看s2是否是s1的子串。
代码:
#include <cstdio>
#include <cstring>
int next[110000];
char a[210000],b[110000];
void Get_next(int *next,char *str){
int i,j;
i=0;
j=next[i]=-1;
while(i<strlen(str)){
if(j==-1||str[i]==str[j]){
next[i+1]=j+1;
i++;
j++;
}
else j=next[j];
}
}
bool kmp(int *next,char *str1,char *str2){
int i,j;
i=j=0;
int last;
int len1=strlen(str1),len2=strlen(str2);
while(i<len1){
if(j==-1||str1[i]==str2[j]){
i++;
j++;
}
else j=next[j];
if(j==len2) return true;
}
return false;
}
int main(){
while(scanf("%s%s",a,b)!=EOF){
int n=strlen(a);
memset(next,0,sizeof(next));
Get_next(next,b);
for(int i=0;i<n;i++) a[n+i]=a[i];
if(kmp(next,a,b)) printf("yes\n");
else printf("no\n");
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
return 0;
}
以上是关于hdu 2203的主要内容,如果未能解决你的问题,请参考以下文章