HDU2203字符串(KMP算法)
http://acm.hdu.edu.cn/showproblem.php?pid=2203
技巧:能前后滚动,实际上用本串连上,例子:abca,连上就是abcaabca,所有情况abca,bcaa,caab,aabc,都有了。
当然本题挺简单用一般方法也可以,但是记得连上时不能用库函数strcat(a1,a2);因为不能strcat(s1,s1);但如果你要再开一个数组当然也可以。。。。
AC代码(KMP算法):
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=100010; char s1[maxn*2],s2[maxn]; int next[maxn],l1,l2; void getnext() { int i=0,j=-1; next[0]=-1; while(i<l2) { if(j==-1||s2[i]==s2[j])//此处是模板串内部比较 { i++,j++; next[i]=j; } else j=next[j]; } } int kmp() { int i=0,j=0,sum=0; while(i<l1) { if(j==-1||s1[i]==s2[j]) i++,j++; else j=next[j]; if(j==l2) { sum++; j=next[j]; } } return sum; } int main() { while(scanf("%s%s",&s1,&s2)!=EOF) { l1=strlen(s1); l2=strlen(s2); if(l1<l2) { printf("no\n"); continue; } for(int i=0;i<l1;i++) s1[l1+i]=s1[i]; l1=l1*2; //printf("* %s *\n",s1); getnext(); if(kmp()) printf("yes\n"); else printf("no\n"); } return 0; }

浙公网安备 33010602011771号