1 条题解
-
1
#include <bits/stdc++.h> using namespace std; using ll = long long; bool Mbe; constexpr int N = 1e7 + 5; ll ans; int n, m, f[N], fst = -1, lst = -1; int zs[N], _zs[N], zt[N]; int ns[N], nt[N], buc[N]; char s[N], t[N]; void calcnxt(int *nt, int *ns) { for(int i = 2; i <= m; i++) { int j = nt[i - 1]; while(j && t[j + 1] != t[i]) j = nt[j]; nt[i] = j + (t[j + 1] == t[i]); } for(int i = 1; i <= n; i++) { int j = ns[i - 1]; while(j && t[j + 1] != s[i]) j = nt[j]; ns[i] = j + (t[j + 1] == s[i]); } } void calcz(int *zt, int *zs) { int l = 1, r = 0; for(int i = 2; i <= m; i++) { int j = i > r ? 0 : min(zt[i - l + 1], r - i + 1); while(t[j + 1] == t[i + j]) j++; if(i + j > r) l = i, r = i + j - 1; zt[i] = j; } l = 1, r = 0; for(int i = 1; i <= n; i++) { int j = i > r ? 0 : min(zt[i - l + 1], r - i + 1); while(i + j <= n && t[j + 1] == s[i + j]) j++; if(i + j > r) l = i, r = i + j - 1; zs[i] = j; } } ll calc(int l, int r) { ll res = 1ll * (l + 1) * (n - r + 2); vector<int> cnt(26); for(int i = r; i <= n; i++) cnt[s[i] - 'a']++; for(int i = 1; i <= l; i++) res -= cnt[s[i] - 'a']; return res; } bool Med; int main() { fprintf(stderr, "%.3lf MB\n", (&Mbe - &Med) / 1048576.0); #ifdef ALEX_WEI FILE *IN = freopen("diary.in", "r", stdin); FILE *OUT = freopen("diary.out", "w", stdout); #endif ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> s + 1 >> t + 1; n = strlen(s + 1), m = strlen(t + 1); calcz(zt, _zs); reverse(s + 1, s + n + 1); reverse(_zs + 1, _zs + n + 1); reverse(t + 1, t + m + 1); calcz(zt, zs), calcnxt(nt, ns); for(int i = 0; i <= m; i++) f[i] = m; for(int i = nt[m]; i; i = nt[i]) f[m - i] = m - i; for(int i = 1; i <= m; i++) f[i] = min(f[i], f[nt[i]]); for(int i = m; i <= n; i++) if(ns[i] == m) fst == -1 && (fst = i - 1), lst = i - m + 2; if(fst != -1) ans = calc(n, 1) - calc(fst, lst); else fst = n, lst = 1; for(int i = 1; i <= fst; i++) zs[i] = min(zs[i], fst - i + 1); for(int i = lst; i <= n; i++) buc[_zs[i] = min(_zs[i], i - lst + 1)]++; for(int i = 1; i <= n; i++) buc[i] += buc[i - 1]; for(int i = 1; i <= fst; i++) { int l = m - zs[i], r = min(n, f[ns[i - 1]] - 1); if(l <= r) ans += buc[r] - buc[l - 1]; } cout << ans << "\n"; cerr << 1e3 * clock() / CLOCKS_PER_SEC << " ms\n"; return 0; } /* g++ diary.cpp -o diary -O2 -std=c++14 -DALEX_WEI */
- 1
信息
- ID
- 14190
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者