汉孤臣のKMP模板(找所有的出现过模式串的下标)
模板题 http://private.vjudge.net/problem/EOlymp-1498
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <deque> #include <map> using namespace std; const int maxn=100000+50; int n,m,ans,nextt[maxn]; string ch1,ch2; void kmp() { int i=0,j=-1; ans=-1; nextt[0]=-1; while (i<ch2.size()) if (j==-1 || ch2[i]==ch2[j]) nextt[++i]=++j; else j=nextt[j]; i=0; j=0; while (i<ch1.size()) { if (j==-1 || ch1[i]==ch2[j]) ++i,++j; else j=nextt[j]; if (j==ch2.size()) { if (ans!=-1) printf(" "); ans=i-j; j=nextt[j]; printf("%d",ans); } } printf("\n"); } int main() { cin>>ch1>>ch2; kmp(); return 0; }

浙公网安备 33010602011771号