#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1000100;
char a[maxn],b[maxn];
int p[maxn],n,m;
void firstdeal()
{
p[1]=0;
int j=0;
for(int i=2;i<=m;i++)
{
while(j&&b[j+1]!=b[i]) j=p[j];
if(b[j+1]==b[i]) j++;
p[i]=j;
}
}
void kmp()
{
int j=0;
for(int i=1;i<=n;i++)
{
while(j>0&&b[j+1]!=a[i]) j=p[j];
if(b[j+1]==a[i]) ++j;
if(j==m)
{
printf("%d\n",i+1-m);
j=p[j];
}
}
}
int main()
{
cin>>a+1;
cin>>b+1;
n=strlen(a+1);m=strlen(b+1);
firstdeal();
kmp();
for(int i=1;i<=m;i++)
printf("%d ",p[i]);
return 0;
}
P3375 【模板】KMP字符串匹配
最新推荐文章于 2020-08-26 15:20:00 发布