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)\)

posted @ 2025-04-17 20:43  Cindy_Li  阅读(51)  评论(0)    收藏  举报