社区讨论

求问神秘ACAM优化(违规自删)

P14363[CSP-S 2025] 谐音替换参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mjo4udkj
此快照首次捕获于
2025/12/27 18:03
2 个月前
此快照最后确认于
2025/12/30 13:30
2 个月前
查看原帖
似乎是错误(至少在 P3808 中是错误的)的 dfs 优化,求 Hack or Proof。
CPP
#include <bits/stdc++.h>
#define endl '\n'
#define fi first
#define se second
#define up(i,l,r) for(int i=(l),E##i=(r);i<=E##i;++i)
#define upr(i,l,r) for(int i=(l),E##i=(r);i<E##i;++i)
#define upr32(i) for (int i=0;i^32;++i)
#define dn(i,r,l) for(int i=(r),E##i=(l);i>=E##i;--i)
using namespace std; typedef long long L;
constexpr L N = 5 + 2e5, M = 5 + 5e6;
namespace {
  int n, q, nc, l, r;
  int s[M][32], cnt[M], f[M], g[M];
  string x, y, st;
  queue<int> que;

  inline void proc() {
    l = INT_MAX, r = 0;
    upr (i, 0, x.size()) {
      if (x[i] != y[i])
        l = min(l, i), r = max(r, i);
    }
    st = x.substr(0, l) + '{' + x.substr(l, r - l + 1)
         + y.substr(l, r - l + 1) + '}' + x.substr(r + 1);
  }

  inline void dfs(int u) {
    if (g[u] == -1) {
      dfs(f[u]);
      g[u] = cnt[u] + g[f[u]];
    }
  }
}
int main() {
  cin.tie(0)->sync_with_stdio(0);
  cin >> n >> q;

  up (i, 1, n) {
    cin >> x >> y;
    if (x == y) continue;
    proc();
    int u = 0;
    for (char c : st) {
      int& son = s[u][c - 'a'];
      if (!son) son = ++nc;
      u = son;
    }
    ++cnt[u];
  }

  upr32(i) if (s[0][i]) que.push(s[0][i]);
  while (!que.empty()) {
    int u = que.front(), *su = s[u], *sfu = s[f[u]];
    que.pop();
    upr32(i) {
      su[i]
      ? (f[su[i]] = sfu[i], que.push(su[i]))
      : void(su[i] = sfu[i]);
    }
  }
  memset(g, -1, sizeof g);
  g[0] = 0;
  up (i, 1, nc) dfs(i);

  up (i, 1, q) {
    cin >> x >> y;
    if (x.size() != y.size()) {cout << "0\n"; continue;}
    proc();
    int u = 0, ans = 0;
    for (char c : st) {
      u = s[u][c - 'a'];
      ans += g[u];
    }
    cout << ans << endl;
  }

  return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...