#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int MAXN = 1000010;
int m, n;
string s, p;
int nxt[MAXN];
int main()
{
cin >> s >> p;
m = s.size(), n = p.size();
s = ' ' + s, p = ' ' + p;
nxt[1] = 0;
for (int i = 2, j = 0; i <= n; i++)
{ // 求next可以看作自己和自己匹配
while (j && p[i] != p[j + 1])
j = nxt[j]; // 匹配失败回跳
if (p[i] == p[j + 1])
j++; // 匹配成功,模式串指针后移
nxt[i] = j;
}
for (int i = 1, j = 0; i <= m; i++)
{
while (j && s[i] != p[j + 1])
j = nxt[j];
if (s[i] == p[j + 1])
j++;
if (j == n) // 每次匹配完成
{
cout << i - n + 1 << endl;
j = nxt[j];
}
}
for (int i = 1; i <= n; i++)
cout << nxt[i] << " ";
return 0;
}
P3375 [模板]KMP