社区讨论
求问神秘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 条回复,欢迎继续交流。
正在加载回复...