https://www.luogu.org/problem/lists?name=3375洛谷P3375KMP字符串匹配
这个算法真是精妙~
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int len1,len2,tot;
int Next[100010],pos[100010];
char s[1000010],t[100010];
void initNext()
{
int j=0;
for(int i=2;i<=len2;i++)
{
while(j&&t[i]!=t[j+1])
j=Next[j];
if(t[i]==t[j+1])
j++;
Next[i]=j;
}
}
/*
void initNext()//从0开始存
{
int j=-1;
Next[0]=-1;
for(int i=1;i<len;i++)
{
while(j!=-1&&t[i]!=t[j+1])
j=Next[j];
if(t[i]==t[j+1])
j++;
Next[i]=j;
}
}*/
int KMP()
{
int j=0,ans=0;
for(int i=1;i<=len1;i++)
{
while(j&&s[i]!=t[j+1])
j=Next[j];
if(s[i]==t[j+1])
j++;
if(j==len2)
{
//ans++;
pos[++tot]=i;
j=Next[j];
}
}
//return ans;
}
int main()
{
scanf("%s%s",s+1,t+1);
len1=strlen(s+1);
len2=strlen(t+1);
initNext();
KMP();
for(int i=1;i<=tot;i++)
printf("%d\n",pos[i]-len2+1);
for(int i=1;i<=len2;i++)
printf("%d ",Next[i]);
return 0;
}