Advertisement
Kevin_Zhang

Untitled

Sep 28th, 2020
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.89 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define pb emplace_back
  3. using namespace std;
  4. using ll = long long;
  5. #ifdef KEV
  6. #define DE(args...) cerr << #args << " = ", kout(args)
  7. void kout() {cerr << endl;}
  8. template<class T1, class ...T2>
  9. void kout (T1 v, T2 ...e) { cerr << v << ", ", kout(e...); }
  10. void debug(auto L, auto R) { while (L != R) cerr << *L << " \n"[next(L)==R], ++L; }
  11. #else
  12. #define DE(...) 0
  13. void debug(...) {}
  14. #endif
  15. const int maxn = 500010;
  16. int n, m;
  17. char a[maxn], b[maxn], c[maxn<<1];
  18. int za[maxn], zb[maxn], zc[maxn<<1];
  19. void build(char c[], char a[], int z[], int za[]) {
  20. #define W(i) (i <= m ? c[i] : a[i - m - 1])
  21.  
  22.     for (int i = 1, l = 0, r = 0;i <= n+m;++i) {
  23.         z[i] = max(0, min(z[ i - l ], r - i + 1));
  24.         while (i + z[i] <= n+m && W(z[i]) == W(z[i]+i))
  25.             l = i, r = i + z[i]++;
  26.     }
  27.     for (int i = 0;i < n;++i)
  28.         za[i] = z[i + m + 1];
  29. }
  30. void init() {
  31.     build(c, a, zc, za);
  32.     reverse(c, c+m);
  33.     reverse(b, b+n);
  34.     build(c, b, zc, zb);
  35.     reverse(c, c+m);
  36.     reverse(b, b+n);
  37.     reverse(zb, zb+n);
  38.  
  39.     for (int i = 0;i < n;++i) {
  40.         if (za[i] == m) --za[i];
  41.         if (zb[i] == m) --zb[i];
  42.     }
  43.     debug(za, za+n);
  44.     debug(zb, zb+n);
  45. }
  46. int ca[maxn], cb[maxn];
  47. ll sa[maxn], sb[maxn];
  48. ll res;
  49. struct bit {
  50.     ll v[maxn];
  51.     void add(int i, ll val) {
  52.         for (;i <= n;i += i&-i)
  53.             v[i] += val;
  54.     }
  55.     ll query(int i) {
  56.         ll res = 0;
  57.         for (;i;i ^= i&-i)
  58.             res += v[i];
  59.         return res;
  60.     }
  61. }t1, t2;
  62. void minu() {
  63. }
  64.  
  65. void solve() {
  66.     init();
  67.     for (int i = 0;i < n;++i)
  68.         ++ca[ za[i] ], ++cb[ zb[i] ];
  69.     for (int i = 1;i <= n;++i)
  70.         sa[i] = sa[i-1] + ca[i] * (ll)i, ca[i] += ca[i-1];
  71.  
  72.     for (int i = 1;i <= n && i < m;++i) if (cb[i] && m - i <= n) {
  73.         ll ad = (sa[n] - sa[ m - i - 1]) - (m-i-1) * (ca[n] - ca[ m - i - 1]);
  74.         res += ad * cb[i];
  75.     }
  76.     DE(res);
  77.     minu();
  78. }
  79. signed main() {
  80.     ios_base::sync_with_stdio(0), cin.tie(0);
  81.     cin >> n >> m >> a >> b >> c;
  82.     solve();
  83.     cout << res << '\n';
  84. }
  85.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement