hdu 2203 亲和串 kmp
因为s2可以出现在s1的一头一尾,所以要在s1末端补上s1开头的一截长为s2的字符,然后进行一遍kmp。
#include <stdio.h> #include <string.h> char a[200020],b[100020]; long p[100020]; int main() { long i,j,n,k,x,y; int flag; while(scanf("%s",&a)!=EOF) { flag=0; scanf("%s",&b); x=strlen(a); y=strlen(b); for(i=x;i>0;i--) a[i]=a[i-1]; for(i=y;i>0;i--) b[i]=b[i-1]; for(i=1;i<=y;i++) a[x+i]=a[i]; j=0; p[1]=0; for(i=2;i<=y;i++) { while(j>0&&b[i]!=b[j+1]) j=p[j]; if(b[i]==b[j+1]) j++; p[i]=j; } j=0; for(i=1;i<=x+y;i++) { while(j>0&&b[j+1]!=a[i]) j=p[j]; if(b[j+1]==a[i]) j++; if(j==y) { flag=1; break; } } if(flag) printf("yes\n"); else printf("no\n"); } return 0; }