标签:答案 tls base 前缀 前缀和 就是 bsp 字符串 strcmp
分段字符串哈希方法
对于一串字符串 $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$ 也不失为一种可行之法。
标签:答案 tls base 前缀 前缀和 就是 bsp 字符串 strcmp
原文地址:https://www.cnblogs.com/QuickSilverX/p/10885299.html