杭电acm2203
http://acm.hdu.edu.cn/showproblem.php?pid=2203
看毛片算法的运用,其中有一个“循环移动”的地方,把s1自身跟自身连接即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<string.h> 3 int next[100010]; 4 char s1[200010],s2[100010]; 5 void cat() 6 { 7 char *s=s1,*ss=s1; 8 int len1=strlen(s1),i=0; 9 while(i<len1) 10 { 11 s[len1+i]=ss[i]; 12 i++; 13 } 14 } 15 void kmppre(int n) 16 { 17 int i,j; 18 i=1; 19 j=next[0]=0; 20 while(i<=n) 21 { 22 if(j==0||s2[j-1]==s2[i-1]) 23 { 24 j++; 25 i++; 26 next[i]=j; 27 } 28 else j=next[j]; 29 } 30 } 31 int kmp(int m,int n) 32 { 33 int i,j; 34 i=1;j=0; 35 while(i<=m&&j<=n) 36 { 37 if(j==0||s2[j-1]==s1[i-1]) 38 { 39 j++; 40 i++; 41 } 42 else j=next[j]; 43 } 44 if(j==n+1) 45 return 1; 46 else return 0; 47 } 48 int main() 49 { 50 while(scanf("%s%s",s1,s2)!=EOF) 51 { 52 kmppre(strlen(s2)); 53 cat(); 54 //printf("%s %s \n",s1,s2); 55 if(kmp(strlen(s1),strlen(s2))) 56 printf("yes\n"); 57 else printf("no\n"); 58 } 59 return 0; 60 }