1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| void init () { for (int i = 1, t = 0; i < m; ++i) { if (t + f[t] > i) f[i] = min(f[i - t], t + f[t] - i); while (i + f[i] < m && B[f[i]] == B[i + f[i]]) ++f[i]; if (i + f[i] > t + f[t]) t = i; } f[0] = m; } void match () { init(); for (int i = 1, t = 0; i < n; ++i) { if (t + g[t] > i) g[i] = min(f[i - t], t + g[t] - i); while (g[i] < m && i + g[i] < n && B[g[i]] == A[i + g[i]]) ++g[i]; if (i + g[i] > t + g[t]) t = i; } while (g[0] < n && g[0] < m && A[g[0]] == B[g[0]]) ++g[0]; }
|