#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define mod 1000000007
ll gcd (ll a, ll b) {return ( a ? gcd(b%a, a) : b );}
ll modPow(ll a,ll b,ll MOD){ll x=1,y=a;while(b>0){if(b%2 == 1){x=(x*y)%MOD;}b/=2;y = (y*y)%MOD;}return x;}
ll modInverse(ll a,ll p){return modPow(a,p-2,p);}
char pat[10000000];
char text[10000000];
const int b=127;
bool check(int i,int m)
{
for(int j=i;j<i+m;j++)
if(text[j]!=pat[j-i])
return false;
return true;
}
ll calc(char * s,int len)
{
ll res=0;
for(int i=0;i<len;i++)
res=(((res)%mod*(b%mod))%mod+s[i]%mod)%mod;
return res;
}
ll recalc(string s,ll len,ll i,ll prev,ll H)
{
prev=(((( (prev%mod-((s[i-len]%mod)*(H%mod))%mod+mod) %mod) %mod)*(b%mod) )%mod+s[i]%mod)%mod;
return prev;
}
void found()
{
int n=strlen(text), m=strlen(pat);
ll hp=calc(pat,m);
if(m>n)
{
printf("\n");return;
}
ll ht=calc(text,m);
ll H=1;
for (int i = 0; i < m-1; i++)
H = ((H%mod)*(b%mod))%mod;
if(ht==hp)
{
if(check(0,m))
printf("0\n");
}
// printf("%d %d\n",ht,hp);
for(int i=m;i<n;i++)
{
ht=recalc(text,m,i,ht,H);
//printf("%d %d\n",ht,hp);
if(ht==hp)
if(check(i-m+1,m))
printf("%d\n",i-m+1);
}
printf("\n");
}
int main()
{
int n;
while(scanf("%d\n",&n)!=EOF)
{
memset(pat,0,sizeof(pat));
memset(text,0,sizeof(text));
scanf("%s",pat);
scanf("%s",text);
found();
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7IAp0eXBlZGVmIGxvbmcgbG9uZyBpbnQgbGw7CiNkZWZpbmUgbW9kIDEwMDAwMDAwMDcKbGwgZ2NkIChsbCBhLCBsbCBiKSB7cmV0dXJuICggYSA/IGdjZChiJWEsIGEpIDogYiApO30KbGwgbW9kUG93KGxsIGEsbGwgYixsbCBNT0Qpe2xsIHg9MSx5PWE7d2hpbGUoYj4wKXtpZihiJTIgPT0gMSl7eD0oeCp5KSVNT0Q7fWIvPTI7eSA9ICh5KnkpJU1PRDt9cmV0dXJuIHg7fQpsbCBtb2RJbnZlcnNlKGxsIGEsbGwgcCl7cmV0dXJuIG1vZFBvdyhhLHAtMixwKTt9CgoKICBjaGFyIHBhdFsxMDAwMDAwMF07CmNoYXIgdGV4dFsxMDAwMDAwMF07CmNvbnN0IGludCBiPTEyNzsKCmJvb2wgY2hlY2soaW50IGksaW50IG0pCnsKICAgIGZvcihpbnQgaj1pO2o8aSttO2orKykKICAgIGlmKHRleHRbal0hPXBhdFtqLWldKQogICAgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7Cn0KbGwgY2FsYyhjaGFyICogcyxpbnQgbGVuKQp7CiAgICBsbCByZXM9MDsKICAgIGZvcihpbnQgaT0wO2k8bGVuO2krKykKICAgIHJlcz0oKChyZXMpJW1vZCooYiVtb2QpKSVtb2Qrc1tpXSVtb2QpJW1vZDsKICAgIAogICAgcmV0dXJuIHJlczsKfQoKbGwgcmVjYWxjKHN0cmluZyBzLGxsIGxlbixsbCBpLGxsIHByZXYsbGwgSCkKewogICAgCiAgICBwcmV2PSgoKCggKHByZXYlbW9kLSgoc1tpLWxlbl0lbW9kKSooSCVtb2QpKSVtb2QrbW9kKSAlbW9kKSAlbW9kKSooYiVtb2QpICklbW9kK3NbaV0lbW9kKSVtb2Q7CiAgICByZXR1cm4gcHJldjsKfQoKdm9pZCBmb3VuZCgpCnsKICAgaW50IG49c3RybGVuKHRleHQpLCBtPXN0cmxlbihwYXQpOwogICAgbGwgaHA9Y2FsYyhwYXQsbSk7CiAgICBpZihtPm4pCiAgICB7CiAgICAgIHByaW50ZigiXG4iKTtyZXR1cm47CiAgICB9CiAgICAKICAgIAogICAgbGwgaHQ9Y2FsYyh0ZXh0LG0pOwogICAgbGwgSD0xOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbS0xOyBpKyspCiAgICAgICAgSCA9ICgoSCVtb2QpKihiJW1vZCkpJW1vZDsKICAgIAogICAgaWYoaHQ9PWhwKQogICAgewogICAgICAgIGlmKGNoZWNrKDAsbSkpCiAgICAgICBwcmludGYoIjBcbiIpOwogICAgfQogICAgCiAgICAvLyBwcmludGYoIiVkICVkXG4iLGh0LGhwKTsKCiAgICBmb3IoaW50IGk9bTtpPG47aSsrKQogICAgewogICAgICAgIGh0PXJlY2FsYyh0ZXh0LG0saSxodCxIKTsKICAgICAgICAgLy9wcmludGYoIiVkICVkXG4iLGh0LGhwKTsKICAgICAgICBpZihodD09aHApCiAgICAgICAgIGlmKGNoZWNrKGktbSsxLG0pKQogICAgICAgICBwcmludGYoIiVkXG4iLGktbSsxKTsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKfQoKaW50IG1haW4oKQp7CiAgICAgICAgaW50IG47CiAgIHdoaWxlKHNjYW5mKCIlZFxuIiwmbikhPUVPRikKICAgewogICAgbWVtc2V0KHBhdCwwLHNpemVvZihwYXQpKTsKICAgIAogICAgbWVtc2V0KHRleHQsMCxzaXplb2YodGV4dCkpOwogICAgCiAgICBzY2FuZigiJXMiLHBhdCk7CiAgICAgIHNjYW5mKCIlcyIsdGV4dCk7CiAgCiAgICBmb3VuZCgpOwogICAgfQp9