题目:
https://www.luogu.org/problem/show?pid=3375
终于弄懂KMP了;
多动手写写才是王道;
注意失配时Next 的跳转;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=2000001;
int Next[MAXN],n,m,cnt,a[MAXN];
char s1[MAXN],s2[MAXN];
void init_Next()
{
int j=0;
for(int i=2;i<=m;i++)
{
while(j && s1[i]!=s1[j+1]) j=Next[j];
if(s1[i]==s1[j+1]) j++;
Next[i]=j;
}
return;
}
void KMP()
{
int j=0;
for(int i=1;i<=n;i++)
{
while(j && s2[i]!=s1[j+1]) j=Next[j];
if(s2[i]==s1[j+1]) j++;
if(j==m) a[++cnt]=i,j=Next[j];
}
}
void solve()
{
scanf("%s%s",s2+1,s1+1);
m=strlen(s1+1);
n=strlen(s2+1);
init_Next();
KMP();
for(int i=1;i<=cnt;i++)
cout<<a[i]-m+1<<"\n";
for(int i=1;i<=m;i++) cout<<Next[i]<<" ";
return;
}
int main()
{
solve();
return 0;
}