hdu 2203 亲和串
把T串扩展成两倍 然后KMP 注意T的长度要大于P的长度
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char P[400005]; char T[400005]; int f[400005]; void getfail() { int m=strlen(P); f[0]=0;f[1]=0; for(int i=1;i<m;i++) { int j=f[i]; while(j&&P[i]!=P[j])j=f[j]; f[i+1]=P[i]==P[j]?j+1:0; } } bool find() { int n=strlen(T); int m=strlen(P); getfail(); int j=0; for(int i=0;i<n;i++) { while(j&&P[j]!=T[i])j=f[j]; if(P[j]==T[i])j++; if(j==m){/*printf("%d\n",i-m+1+1);*/return true;} } return false; } int main() { while(scanf("%s%s",T,P)!=EOF) { int len=strlen(T); for(int i=len;i<len*2;i++) { T[i]=T[i-len]; } if(find() && strlen(T)/2>=strlen(P))printf("yes\n"); else printf("no\n"); } return 0; }