KMP
搞两个链接:11111和22222。都讲的特别清晰易懂。
再来个洛谷模板题的链接
最后是代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 int lenT,lenP,k; 4 int next[1001]; 5 char T[1000001],P[1001]; 6 void make_next(){ 7 k=0; 8 for(int i=1;i<lenP;i++){ 9 while(k&&P[i]!=P[k]) 10 k=next[k-1]; 11 if(P[i]==P[k]) 12 k++; 13 next[i]=k; 14 } 15 } 16 int kmp(){ 17 k=0; 18 for(int i=0;i<lenT;i++){ 19 while(k&&P[k]!=T[i]) 20 k=next[k-1]; 21 if(P[k]==T[i]) 22 k++; 23 if(k==lenP) 24 printf("%d ",i-lenP+2); 25 } 26 } 27 int main(){ 28 scanf("%s",T); 29 scanf("%s",P); 30 lenT=strlen(T); 31 lenP=strlen(P); 32 make_next(); 33 kmp(); 34 for(int i=0;i<lenP;i++) 35 printf("%d ",next[i]); 36 return 0; 37 }
完了