KMP 算法思想:从n*m的匹配结构,优化为在n上滑动,m根据预处理一步更新到位注意:字符串是从0开始预处理本身就是两个相同字符串的KMP过程代码及注释 #include<bits/stdc++.h> using namespace std; typedef long long LL; const int maxn = 1e6+5; const int maxm = 1e3+5; char a[maxn],b[maxn]; int nxt[maxm]; //nxt[i]表示:当匹配到i个字符时,[0,nxt[i] ) 与 ( i-nxt[i],i]匹配 inline void make_next() { int m=strlen(b),k=0; for(int i=1;i<m;++i) { while(k&&b[i]!=b[k]) k=nxt[k-1]; if(b[i]==b[k]) ++k; nxt[i]=k;//也表示:第i个数,匹配到了k-1个数。指向的第k个数还没匹配 } } inline void KMP() { int n=strlen(a),m=strlen(b),k=0; for(int i=0;i<n;++i) { while(k&&a[i]!=b[k]) k=nxt[k-1]; if(a[i]==b[k]) ++k; if(k==m) printf("%d\n",i-m+2); } } inline void print() { for(int i=0;i<strlen(b);++i) printf("%d ",nxt[i]); } int main() { scanf("%s%s",a,b); make_next(); KMP(); print(); return 0; }