2025.4.5 不同对象的哈希方法
4.5 不同对象的哈希方法
P10992
关键在“相同字符的相对位置”,考虑使用 \(c_i=i-lst_i\) 进行刻画。
这样在滑动窗口上加/减一个字符只会修改 \(O(1)\) 个位置,直接对 \(c_i\) 做多项式哈希即可。
外层套一个二分,判断可以做到 \(O(n\log n)\) 或精细一点的 \(O(n)\)
CF1479D
先考虑如何判断是否存在:
- 对每个颜色 \(x\) 赋 64 位权值 \(V(x)\)
- 判断 \(u\to v\) 路径 \(\bigoplus\limits_{c_i\in [l,r]} V(c_i) \neq 0\)
考虑如何找到一个数:
- 经典套路 \(S(u,v) = S(1,u)\oplus S(1,v) \oplus S(1,lca(u,v)) \oplus S(1,fa(lca(u,v)))\)
- 于是只需要维护每个点到根的路径信息
- 值域上开可持久化线段树,查询直接树上二分,找到第一个异或 \(\neq 0\) 的位置,就是一个答案。
QOJ 9887
笛卡尔树同构 \(\Leftrightarrow\) 每个子区间 min 位置相同
考虑用一个信息限制得到区间 min
- 记录每个位置后面第一个比它小的位置
- 从左到右第一个指向区间外的就是最小值
不考虑指向区间外的,扫描线每次加入指向 \(i\) 的边,线段树维护后缀 hash 值。
ABC274H
乘法对异或没有分配律,故一般的多项式哈希不能用。
但是 \(\bmod 2\) 意义下,异或等价于加法,而乘法对加法有分配律。
故把 \(a_i\) 视作向量,\(B\) 是一个矩阵,在 \(\bmod 2\) 意义下做矩阵乘,即 \((\oplus,{\rm And})\) 矩阵乘。
位运算可以把矩阵乘优化到 \(O(k^2)\),矩阵乘向量 \(O(k)\)。
套个倍增,总复杂度 \(O(nk\log n)\)

浙公网安备 33010602011771号