include[HTML_REMOVED]
using namespace std;
const int N=10010,M=100010;
int n,m;//n表示子串长度,m表示主串长度;
char p[N],s[M];//p[N]表示子串,s[M]表示主串,全局数组自动初始化为0;
int ne[N];//next[j];
int main()
{
cin>>n>>p+1>>m>>s+1;
//求next的过程;
for(int i=2,j=0;i<=n;i++)//i从2开始,ne[1]已经被初始化为0;
{
while(j&&p[i] != p[j+1]) j=ne[j];//当比较不相等时,j=ne[j]后退,当j=0时不需要后退;while中为j后退的相关条件;
if(p[i] == p[j+1]) j++;//如果比较相等,j++,继续比较下一位;
ne[i] = j; //生成next[j];
}
//kmp 匹配过程;
for(int i=1,j=0;i<=m;i++)
{
while(j&&s[i] != p[j+1]) j=ne[j];//当比较不相等时,j=ne[j]后退,当j=0时不需要后退;while中为j后退的相关条件;
if(s[i] == p[j+1]) j++;//如果比较相等,j++,继续比较下一位;
if(j == n)//如果比较完,则输出;因为j是从0开始++,所以不是j==n+1,而是j==n;
{
printf("%d ",i-n);//如果数组下标从1开始,则输出i-n+1,,但是本题中说数组下标从0开始,所以为i-n;
j=ne[j];//j后退,为下一次模式匹配做准备,接着匹配,直到找出所以匹配位置,并且输出起始下标;
}
}
return 0;
}
}