ekmp 自己整理的模板,仅作模板保存使用
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAX=100010;
int net[MAX],extend[MAX];
char ss[MAX],tt[MAX];
void getnet(int len)
{
int i=0,j,po;
net[0]=len;
while(tt[i]==tt[i+1]&&i+1<len) i++;net[1]=i;
po=1;
for(i=2;i<len;i++)
{
if(net[i-po]+i<net[po]+po) net[i]=net[i-po];
else
{
j=net[po]+po-i;
if(j<0) j=0;
while(i+j<len&&tt[j]==tt[j+i]) j++;
net[i]=j;po=i;
}
}
}
void getextend(int lens,int lent)
{
int i=0,j,po;
while(ss[i]==tt[i]&&i<lens&&i<lent) i++; extend[0]=i;
po=0;
for(i=1;i<lens;i++)
{
if(net[i-po]+i<extend[po]+po) extend[i]=net[i-po];
else
{
j=extend[po]+po-i;
if(j<0) j=0;
while(i+j<lens&&j<lent&&ss[j+i]==tt[j]) j++;
po=i;extend[i]=j;
}
}
}
int main()
{
cin>>ss;
cin>>tt;
int lens=strlen(ss);
int lent=strlen(tt);
getnet(lent);
getextend(lens,lent);
for(int i=0;i<=lent;i++)
cout<<net[i]<<" ";
cout<<endl;
for(int i=0;i<=lens;i++)
cout<<extend[i]<<" ";
cout<<endl;
return 0;
}