字符串hash Eowcoder 5026 E
题
https://ac.nowcoder.com/acm/contest/5026/E
字符串hash
遇到了无数遍了
来讲一种常见的字符串hash吧
首先给一个字符串s,假设它只有小写英文字母
根据万物皆是数的想法
我们可以把它每一位通过 s[i]-'a'
变成数字
这样原字符串就变成了一个数列,因为全是字母
所以可以26为进制 sum((s[i]-'a')*26^i)
的形式把原来的数变成大的整数
如果两个字符串相等,那么这个大整数,相等,否则大整数不等。
通过取mod可以让它比较可以操作,和支持更长的长度
变成sum((s[i]-'a')*26^i) %p
的形式
当我们有一个字符串s0s1...sn
时
增删首尾都是 可以通过考虑计算大整数的方式去处理,预处理26的幂次模p即可
这样 长度为n的字符串的所有长度为m的连续子串的hash值,我们可以只用O(n)的时间就可完成
关于冲突
注意到上面的26是对于字母的情况,实际上,只要这个幂次的基
大于每一位上的最大值
即可,所以考虑单个字符的最大ascii
可以变成 sum(s[i] * b^i) %p
的形式, b 取质数重要吗迷? 然后p取尽量大的质数就行
$Hash(S) = \sum_{i=0->n-1} s[i] * b^i \mod p$