一种新奇的字符串哈希方法

前言

做一道需要动态改字符串哈希值的题时,突发奇想获得了一个在某些方面可能更容易维护的字符串哈希方法,据说是对的。

不过据说这好像不算是新方法,它好像早有记载。

Update : 不是据说了,此事在 [CSP-S 2023] 消消乐 中早有记载。

正文

注意:默认字符串下标为 0 - index。

先考虑一个明显错误的哈希:我们给每个字符随机生成一个权值,定义一个字符串的哈希值为其中每个字符的权值和,也就是 \(H(S) = \sum_{i = 0}^{|S| - 1} w[S[i]]\)。

因为出题人不知道每个字符对应的权值,所以正常情况下(至少我能想到的)他会通过交换字符的顺序来卡掉这种哈希。

为什么可以这样卡呢?因为加法是满足交换律的。这启示我们改用一种不满足交换律的运算。

容易想到,矩阵乘法是不满足交换律的。

所以我们给每个字符随机生成一个矩阵,定义一个字符串的哈希值为从左到右做矩阵乘法的结果。

这样,我们就可以比较方便的维护某个区间的哈希值,单点修,并且强度也比普通的字符串哈希要强。缺点是因为有矩阵乘法,所以常数比较大。

这种方法还有一个应用,就是处理有多种括号的括号序列是否匹配。具体的,我们可以让每种扩号的右括号是左括号的逆矩阵。

posted @ 2026-07-10 20:21  Crimson_Moon  阅读(30)  评论(1)    收藏  举报