1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include <bits/stdc++.h> using namespace std;
#define y1 gmdllll typedef complex<double> cp; const int N = 1200005; const double pi = acos(-1.0), eps = 0.05; int n, m, rev[N]; double x1[N], y1[N]; cp a[N], b[N], p[N]; char x[N], y[N];
void fft(cp *a, int n, int inv) { for (int i = 1; i < n; i++) if (i < rev[i]) swap(a[i], a[rev[i]]); for (int k = 1; k < n; k <<= 1) { cp wn(cos(pi / k), inv * sin(pi / k)); for (int i = 0; i < n; i += 2 * k) { cp w(1, 0.0); for (int j = 0; j < k; j++, w *= wn) { cp x = a[i + j], y = w * a[i + j + k]; a[i + j] = x + y, a[i + j + k] = x - y; } } } if (inv < 0.0) for (int i = 0; i < n; i++) a[i] /= n; }
int main() { scanf("%d %d", &m, &n); scanf("%s %s", x , y); reverse(x, x + m); for (int i = 0; i < m; i++) x1[i] = (x[i] == '*') ? 0.0 : (x[i] - 'a' + 1); for (int i = 0; i < n; i++) y1[i] = (y[i] == '*') ? 0.0 : (y[i] - 'a' + 1); int l = 0, len = 1; while (len <= n + m) len <<= 1, l++; for (int i = 1; i < len; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
for (int i = 0; i < len; i++) a[i] = cp(x1[i], 0.0), b[i] = cp((y1[i]) * (y1[i]) * (y1[i]), 0.0); fft(a, len, 1), fft(b, len, 1); for (int i = 0; i < len; i++) p[i] += a[i] * b[i]; for (int i = 0; i < len; i++) a[i] = cp((x1[i]) * (x1[i]) * (x1[i]), 0.0), b[i] = cp(y1[i], 0.0); fft(a, len, 1), fft(b, len, 1); for (int i = 0; i < len; i++) p[i] += a[i] * b[i]; for (int i = 0; i < len; i++) a[i] = cp((x1[i]) * (x1[i]), 0.0), b[i] = cp((y1[i]) * (y1[i]), 0.0); fft(a, len, 1), fft(b, len, 1); for (int i = 0; i < len; i++) p[i] -= cp(2.0, 0.0) * a[i] * b[i]; fft(p, len, -1); int v[N], top = 0; for (int i = m - 1; i < n; i++) if (fabs(p[i].real()) < eps) v[++top] = i - m + 2; printf("%d\n", top); for (int i = 1; i <= top; i++) printf("%d ", v[i]); return 0; }
|