【分析】KMP算法。需要注意的是这里要将字符串看作环状串。
#include <stdio.h> #include <string.h> #define maxlen 100005 char s1[maxlen],s2[maxlen]; int next[maxlen]; int len1,len2; void Getnext(char *s1,char *s2,int *next) { int i=0,j=-1; next[0]=-1; while(i<len2) { if(j==-1 || s1[i]==s2[j]) { i++; j++; next[i]=j; } else j=next[j]; } } void KMP(char *s1,char *s2,int *next) { int i=0,j=0; Getnext(s1,s2,next); while(i<2*len1) { if(j==-1 || s1[i%len1]==s2[j]) { i++;j++; if(j==len2) { printf("yes\n"); return; } } else j=next[j]; } printf("no\n"); } int main() { while(gets(s1)) { gets(s2); len1=strlen(s1); len2=strlen(s2); KMP(s1,s2,next); } return 0; }