#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
//#define int long long
//#define double long double
#define eps 1e-5
//#define mod 1e9+7
using namespace std;
const int mod=10007;
const int M=10007;
const int N=2*1e6+5;//空间最大限制 4e8
int a[N],sum;
char c1[N],c2[N];
int f[N],tot;
void prefix(char s[])
{
a[0]=-1;
int i=0,j=-1;
int n=strlen(s);
while(i<n)
{
if(j==-1||s[i]==s[j])
{
j++;
i++;
a[i]=j;
}
else j=a[j];
}
}
void kmp(char s[],char s1[])
{
int n=strlen(s);
int m=strlen(s1);
int i=0,j=0;
while(i<n&&j<m)
{
if(j==-1||s[i]==s1[j]) i++,j++;
else j=a[j];
if(j==m)
{
sum++;
f[++tot]=i-m;
j=a[j];
}
}
}
signed main()
{
scanf("%s%s",c1,c2);
prefix(c2);
kmp(c1,c2);
int n=strlen(c2);
for(int i=1;i<=tot;i++) printf("%d\n",f[i]+1);
for(int i=1;i<=n;i++) printf("%d ",a[i]);
return 0;
}
P3375 【模板】KMP字符串匹配
最新推荐文章于 2022-05-06 12:19:57 发布