#include <iostream>
#include <vector>
#include <string>
using namespace std;
void solve() {
string s, p; cin >> s >> p;
s = " " + s; p = " " + p; // 转为1-based下标
int n = s.size() - 1, m = p.size() - 1;
// next[i]: 前缀p[1..i]的最长border长度
vector<int> next(m + 1); next[1] = 0;
// 计算next数组 O(m)
for (int i = 2, j = 0; i <= m; i++) {
while (j > 0 && p[i] != p[j + 1]) j = next[j];
if (p[i] == p[j + 1]) j++;
next[i] = j;
}
// 匹配过程 O(n)
for (int i = 1, j = 0; i <= n; i++) {
while (j > 0 && s[i] != p[j + 1]) j = next[j];
if (s[i] == p[j + 1]) j++;
if (j == m) {
cout << i - m + 1 << endl; // 输出匹配位置(1-based)
// j = next[j]; // 继续匹配后续可能位置
}
}
// 输出前缀的最长border长度
for (int i = 1; i <= m; i++) cout << next[i] << " ";
cout << endl;
}