字符串hash(类似于进制的hash)

分段字符串哈希方法

对于一串字符串 $orztrj$ ,我们有一种哈希的方法,该串哈希值为:

$((((o * base + r) * base + z) * base + t) * base + r) * base + j$

$o * base^5 + r * base^4 + z * base^3 + t * base^2 + r * base^1 + j * base^0$

其中 $base$ 设成一个素数,记得取模

于是哈希数组如下:

$hash[1] = o * base^0$

$hash[2] = o * base^1 + r * base^0$

$hash[3] = o * base^2 + r * base^1 + z * base^0$

$hash[4] = o * base^3 + r * base^2 + z * base^1 + t * base^0$

$hash[5] = o * base^4 + r * base^3 + z * base^2 + t * base^1 + r * base^0$

$hash[6] = o * base^5 + r * base^4 + z * base^3 + t * base^2 + r * base^1 + j * base^0$ 

当我们判一个串 $deep$ 是否是它的子串时,我们进行一个一个比对

比较 $deep$ 和 $ztrj$ , 此时$l = 3,r = 6$,要得出 $ztrj$ 的哈希值,我们只需算出 $hash[6] - hash[3-1=2] * base^{r-l+1}$ 就是答案。(类似与前缀和)

所以除了 $KMP$ 和 $STLstrcmp$ ,字符串 $hash$ 也不失为一种可行之法。

posted @ 2019-05-18 12:10  QuickSilverX  阅读(209)  评论(0编辑  收藏  举报