На с++ есть решение этой задачи (привет, тинькофф):
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <iomanip>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef unsigned long long ull;
const int MAGIC = 10007;
const int MAXL = 1111111;
char s[MAXL], t[MAXL];
ull pre_s[MAXL], pre_t[MAXL], suf_s[MAXL], suf_t[MAXL];
inline void get_hash(char* s, ull* pre, ull* suf) {
int n = strlen(s);
pre[0] = s[0];
for (int i = 1; i < n; ++i)
pre[i] = pre[i - 1] * MAGIC + s[i];
suf[n - 1] = s[n - 1];
for (int i = n - 2; i >= 0; --i)
suf[i] = suf[i + 1] * MAGIC + s[i];
}
int main() {
gets(s);
gets(t);
get_hash(s, pre_s, suf_s);
get_hash(t, pre_t, suf_t);
int m = strlen(s);
vector<int> ans;
for (int i = 0; i < m; ++i)
if ((i == 0 || pre_s[i - 1] == pre_t[i - 1]) && (i == m - 1 || suf_s[i + 1] == suf_t[i]))
ans.push_back(i + 1);
printf("%d\n", (int)ans.size());
if (ans.size()) {
printf("%d", ans[0]);
for (int i = 1; i < (int)ans.size(); ++i)
printf(" %d", ans[i]);
printf("\n");
}
}