KMP其实到现在还是很容易忘记(经常刚才懂,马上又忘了这么算出next值了),但是这个很不经常用,所以也没深究了
//KMP #include <stdio.h> main() { char str1[100],str2[100]; int n,m,q,i,j,p[100]={0}; scanf("%d%d%*c",&n,&m); for(i=1;i<=n;i++)scanf("%c",&str1[i]); getchar(); for(i=1;i<=m;i++)scanf("%c",&str2[i]); for(i=2;i<=m;i++) { q=i-1; while(str2[p[q]+1]!=str2[i]&&q!=0) q=p[q]; if(str2[p[q]+1]==str2[i])p[i]=p[q]+1; else p[i]=0; } i=0;j=0; while(j<m&&i<=n) { if(str1[i+1]==str2[j+1]) { i++;j++; } else if(j==0)i++; else j=p[j]; } if(i<=n)printf("%d\n",i); else printf("no exist\n"); }