1 条题解

  • 1
    @ 2026-8-6 10:26:37
    #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

    [湖北省选模拟 2023] 日记 / diary

    信息

    ID
    14190
    时间
    2000ms
    内存
    1024MiB
    难度
    9
    标签
    递交数
    1
    已通过
    1
    上传者