#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s1[1000005],s2[1000005];
int fail[1000005];
void init(int m)
{
fail[1]=0;
for(int i=2;i<=m;i++)
{
int p=fail[i-1];
while(p&&s2[i]!=s2[p+1])p=fail[p];
if(s2[p+1]==s2[i]) p++;
fail[i]=p;
}
}
void kmp(int n,int m)
{
int p=0;
for(int i=1;i<=n;i++)
{
while(p&&s1[i]!=s2[p+1])p=fail[p];
if(s1[i]==s2[p+1]) p++;
if(p==m)
{
printf("%d\n",i-p+1);
p=fail[p];
}
}
}
int main()
{
scanf("%s",s1+1);
scanf("%s",s2+1);
int n=strlen(s1+1);
int m=strlen(s2+1);
init(m);
kmp(n,m);
}
KMP模板
最新推荐文章于 2018-12-27 20:49:18 发布