继续发模板……
#include<cstdio>
#include<cstring>
#define MAXN 1000000
using namespace std;
inline int max(int a,int b){return a>b?a:b;}
int next[MAXN+5],ex[MAXN+5];
char a[MAXN+5],b[MAXN+5];
void getdata(char *s1,char *s2,int *data)
{
int i,j,k;
int len1=strlen(s1),len2=strlen(s2);
for(i=0,j=0;i<len1&&j<len2&&s1[i]==s2[j];i++,j++);
data[0]=j;
for(i=1,j=0;i<len1&&j<len2&&s1[i]==s2[j];i++,j++);
data[1]=j;
int maxi=1,maxp=0;
for(i=2;i<len1;i++)
{
if(i+next[i-maxi]<maxp)
data[i]=next[i-maxi];
else
{
for(k=max(maxp,i);k<len1&&k-i<len2&&s1[k]==s2[k-i];k++);
maxp=k;
maxi=i;
data[i]=(k-i)>0?k-i:0;
}
}
}
int main()
{
scanf("%s%s",a,b);
int len=strlen(a);
getdata(b,b,next);
getdata(a,b,ex);
printf("%d",ex[0]);
for(int i=1;i<len;i++)
printf(" %d",ex[i]);
}