#include<iostream>
#include<cstdio>
#include<iomanip>
#define ll long long
#define inf 0x3f3f3f3f
#define loop(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
string t,p;int n3xt[1000000+1];
void mk_n3xt();
int main()
{
cin>>t>>p;
mk_n3xt();
int j=1;
loop(i,1,t.size()){
if(t[i-1]!=p[j-1] and j>1) j=n3xt[j-1]+1;
if(t[i-1]==p[j-1]) j++;
if(j>p.size()){
cout<<i-p.size()+1<<endl;
j=n3xt[j-1]+1; //这一步边界特判,其实不加也可以,很难去描述;
} //可以看成p[p.size()+1]处也有一个字符;
} //这样是有一点细小的优化的.
return 0;
}
void mk_n3xt()
{
int tmp=0; n3xt[1]=0;
loop(i,2,p.size()){
while(p[i-1]!=p[tmp+1-1] and tmp){
tmp=n3xt[tmp];//类似于分形
}
if(p[i-1]==p[tmp+1-1]) tmp++;
n3xt[i]=tmp;
}
}
#include<cstdio>
#include<iomanip>
#define ll long long
#define inf 0x3f3f3f3f
#define loop(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
string t,p;int n3xt[1000000+1];
void mk_n3xt();
int main()
{
cin>>t>>p;
mk_n3xt();
int j=1;
loop(i,1,t.size()){
if(t[i-1]!=p[j-1] and j>1) j=n3xt[j-1]+1;
if(t[i-1]==p[j-1]) j++;
if(j>p.size()){
cout<<i-p.size()+1<<endl;
j=n3xt[j-1]+1; //这一步边界特判,其实不加也可以,很难去描述;
} //可以看成p[p.size()+1]处也有一个字符;
} //这样是有一点细小的优化的.
return 0;
}
void mk_n3xt()
{
int tmp=0; n3xt[1]=0;
loop(i,2,p.size()){
while(p[i-1]!=p[tmp+1-1] and tmp){
tmp=n3xt[tmp];//类似于分形
}
if(p[i-1]==p[tmp+1-1]) tmp++;
n3xt[i]=tmp;
}
}