KMP模板
2019-04-06 14:52 一只弱鸡丶 阅读(161) 评论(0) 收藏 举报题目链接:https://www.luogu.org/problemnew/show/P3375
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define P pair<int,int>
const int N=1e6+10;
const int mod=200907;
void read(int &a)
{
a=0;
int d=1;
char ch;
while(ch=getchar(),ch>'9'||ch<'0')
if(ch=='-')
d=-1;
a=ch-'0';
while(ch=getchar(),ch>='0'&&ch<='9')
a=a*10+ch-'0';
a*=d;
}
void write(int x)
{
if(x<0)
putchar(45),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
}
int kmp[N];
int main()
{
string ss,st;
cin>>ss>>st;
int j=-1;
kmp[0]=kmp[1]=-1;
for(re int i=1;i<st.size();i++)
{
while(j>-1&&st[j+1]!=st[i])
j=kmp[j];
if(st[j+1]==st[i])
j++;
kmp[i]=j;
}
for(re int i=0;i<ss.size();i++)
{
while(j!=-1&&st[j+1]!=ss[i])
j=kmp[j];
if(ss[i]==st[j+1])
j++;
if(j==st.size()-1)
cout<<i-st.size()+2<<endl,j=kmp[j];
}
for(re int i=0;i<st.size();i++)
cout<<kmp[i]+1<<" ";
return 0;
}
浙公网安备 33010602011771号