学习资料:http://www.cnblogs.com/SYCstudio/p/7194315.html
例题1:洛谷3375:https://www.luogu.org/problemnew/lists?name=3375
解:
#include <cstdio> #include <iostream> #include <cstring> using namespace std; const int maxn=1000000+10; char s1[maxn],s2[maxn]; int nex[maxn],len1,len2; void getnext() { nex[0]=-1; int j=nex[0]; for(int i=1;i<len2;i++) { while(j>=0&&s2[j+1]!=s2[i]) j=nex[j]; if(s2[j+1]==s2[i]) j++; nex[i]=j; } } void solve() { int k=-1; for(int i=0;i<len1;i++) { while(s2[k+1]!=s1[i]&&k!=-1) { k=nex[k]; } if(s2[k+1]==s1[i]) k++; if(k==len2-1) { printf("%d ",i-len2+2); k=-1;i=i-len2+1; } } } int main() { scanf("%s",s1); scanf("%s",s2); len1=strlen(s1); len2=strlen(s2); getnext(); solve(); for(int i=0;i<len2;i++) printf("%d%c",nex[i]+1," "[i==len2-1]); return 0; }