#include #include #include #include #include using namespace std; int logLimit; int limit; vector rev; void calcRev () { rev = vector (limit, 0); for (int i = 0; i < limit; i++) for (int k = 0; k < logLimit; k++) if (i & (1 << k)) rev[i] ^= 1 << (logLimit - k - 1); } using Num = complex ; double const Pi = acos (-1.0); vector z; void calcZ () { z = vector (limit); for (int i = 0; i < limit; i++) z[i] = Num (cos (i * 2 * Pi / limit), sin (i * 2 * Pi / limit)); } vector fft (const vector & a0, bool inv = false) { vector a = a0; for (int i = 0; i < limit; i++) if (i < rev[i]) swap (a[i], a[rev[i]]); if (inv) reverse (z.begin () + 1, z.end ()); for (int k = 0, span = 1, step = limit / 2; k < logLimit; k++, span *= 2, step /= 2) { for (int i = 0; i < limit; i += 2 * span) for (int j = 0; j < span; j++) { int u = i + j; int v = i + j + span; Num x = a[u] + a[v] * z[j * step]; Num y = a[u] + a[v] * z[j * step + limit / 2]; a[u] = x; a[v] = y; } } if (inv) { reverse (z.begin () + 1, z.end ()); for (int i = 0; i < limit; i++) a[i] /= limit; } return a; } int main () { string s, t; cin >> s >> t; limit = int (s.size ()); logLimit = int (log2 (limit) + 0.5); calcRev (); calcZ (); reverse (t.begin () + 1, t.end ()); vector a (limit), b (limit); for (int i = 0; i < limit; i++) { a[i] = Num (s[i] - '0'); b[i] = Num (t[i] - '0'); } auto fa = fft (a); auto fb = fft (b); auto fc = vector (limit); for (int i = 0; i < limit; i++) fc[i] = fa[i] * fb[i]; auto c = fft (fc, true); vector res (limit); for (int i = 0; i < limit; i++) res[i] = int (c[i].real () + 0.5); for (int i = 0; i < limit; i++) cout << i << ": " << res[i] << endl; auto pos = max_element (res.begin (), res.end ()); cout << "best = " << *pos << endl; cout << "pos = " << pos - res.begin () << endl; return 0; }