#include <iostream>
#include <bits/stdc++.h>
using namespace std;
string a,b;
const int maxn = 1e6+10;
int ne[maxn],n,m;
vector <int> Q;
void getne(string s)
{
ne[1]=0;
for (int i=2;i<=m;i++)
{
int k=ne[i-1];
if (s[k+1]==s[i]) ++k;
else
{
while (k>0&&s[k+1]!=s[i]) k=ne[k];
if (s[k+1]==s[i]) ++k;
}
ne[i]=k;
}
return;
}
void kmp(string s,string t)
{
getne(t);
int k=0;
for (int i=1;i<=n;i++)
{
if (t[k+1]==s[i]) ++k;
else
{
while(k>0&&t[k+1]!=s[i]) k=ne[k];
if (t[k+1]==s[i]) ++k;
}
if (k==m)
{
Q.push_back(i-m+1);
k=ne[k];
}
}
}
int main()
{
cin>>a>>b;
n=a.size();m=b.size();
a="0"+a;
b="0"+b;
kmp(a,b);
for (int i=0; i<Q.size();i++)
{
printf("%d\n",Q[i]);
}
for (int i=1;i<=m;i++)
{
i==m ? printf("%d\n",ne[i]) : printf("%d ",ne[i]);
}
return 0;
}