void getnx(char *str){
    //nx[i] 是str[1..x]与str[y..i]的最大公共前缀长度 x<i,y>1
    int len=strlen(str);int i=0,k=-1;nx[0]=-1;
    while(i<len)if(k==-1||str[i]==str[k])nx[++i]=++k;else k=nx[k];
}
int index(char *str,char *p){
    int i=0,j=0;int len1=strlen(str),len2=strlen(p);
    if(len1==1&&len2==1)if(str[0]==p[0])return 0;else return -1;
    int nx[N];getnx(p,nx);
    while(i<len1&&j<len2)
    if(j==-1||str[i]==p[j])i++,j++;else j=nx[j];
    if(j==len2)return i-len2;else return -1;
}
int Count(char *str,char *p){
    int ans=0,i=0,j=0;int nx[N];
    int len1=strlen(str),len2=strlen(p);
    if(len1==1&&len2==1)if(str[0]==p[0])return 1;else return 0;
    getnx(p,nx);
    for(i=0;i<len1;i++){
        while(j>0&&str[i]!=p[j])j=nx[j];
        if(str[i]==p[j])j++;
        if(j==len2)ans++,j=nx[len2];
    }
    return ans;
}

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
char s1[N],s2[N];
int z[N],mix=0,L=0;
int main(){
    scanf("%s%s",&s2,&s1);
    int n=strlen(s1);
    strcat(s1,"#");strcat(s1,s2);
    for(int i=1;s1[i];i++){
        if(i>=mix)z[i]=0;
        else z[i]=min(mix-i,z[i-L]);
        while(s1[z[i]]==s1[z[i]+i])z[i]++;
        if(i+z[i]>mix)mix=i+z[i],L=i;
    }
    for(int i=0;i<n;i++)printf("%d%c",z[i]," \n"[i==n-1]);//s1的每一个后缀与s1[1..n]最大公共前缀长度
    for(int i=n+1;s1[i];i++)cout<<z[i]<<' ';//s2的每一个后缀与s1[1..n]最大公共前缀长度
}