题目:
见https://www.luogu.com.cn/problem/P3375
思路:
KMP字符数组从1开始,不要用0,还有next数组用Next因为c++中存在next这个关键字
代码:
//KMP一定得用1开始,切记切记
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1e6+10;
int Next[N],f[N];
char str1[N],str2[N];
void KMP(char *a)
{
int len=strlen(a+1);
for(int i=2,j=0;i<=len;i++)
{
while(j>0&&a[i]!=a[j+1]) j=Next[j];
if(a[i]==a[j+1]) j++;
Next[i]=j;
}
}
void fKMP(char *a,char *b)
{
int lena=strlen(a+1);
int lenb=strlen(b+1);
for(int i=1,j=0;i<=lena;i++)
{
while(j>0&&(a[i]!=b[j+1]||j==lenb)) j=Next[j];
if(a[i]==b[j+1]) j++;
f[i]=j;//当j==n也就是匹配到了
}
}
int main()
{
scanf("%s%s",str1+1,str2+1);
KMP(str2);
fKMP(str1,str2);
int lena=strlen(str1+1);
int lenb=strlen(str2+1);
for(int i=1;i<=lena;i++)
if(f[i]==lenb)
cout<<i-lenb+1<<endl;
for(int i=1;i<=strlen(str2+1);i++)
cout<<Next[i]<<" ";
return 0;
}