//kmp思想:
//找最长相等前后缀,例如文本串为:aabaabaaf,模式串为:aabaaf;
//a,aa,aab,aaba,aabaa,aabaaf的最长相等前后缀为:0,1,0,1,2,0;
//a a b a a f
//0 1 0 1 2 0
//0 1 2 3 4 5下标
//到f的时候不匹配了,找f前面的a,找到下标为2的位置(b),f再从b开始再匹配baaf
//next数组就是返回再一次匹配时候b的位置
//给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。
//模板串 P 在模式串 S 中多次作为子串出现。
//求出模板串 P 在模式串 S 中所有出现的位置的起始下标。
//下标从1开始
#include <iostream>
using namespace std;
const int N=100010,M=1000010;
int n,m;
int ne[N];
char s[M],p[N];
int main()
{
cin>>n>>p+1>>m>>s+1;
for (int i=2,j=0;i<=n;i++)//1的回溯下标是0,所以我们从2开始
{
while(j&&p[i]!=p[j+1]) j=ne[j];//j没有退回到起点,退到起点的话就重新匹配了
if(p[i]==p[j + 1]) j++ ;
ne[i]=j;
}
for (int i=1,j=0;i<=m;i++)
{
while(j&&s[i]!=p[j+1])j=ne[j];
if (s[i]==p[j+1]) j++ ;
if (j==n)
{
printf("%d ",i-n);
j=ne[j];
}
}
return 0;
}