就是把某个字符串把某个串转化成一个数,使相同的串转化成的数一定相同,不同的串转化成的数尽量不同。
最常用的是进制哈希。(hash[i]=(hash[i-1]*p+(ll)s[i])\%mod)(其中(p)没有要求,但一般取一个质数,如(131,13331)等;(mod)要取一个大数,最方便的就是开(unsigned long long),即(mod=2^{64}))
然后我们对于一个串做处理后,就可以知道任意(l)到(r)位的字符串的哈希值了。具体的,有(hash[lsim{r}]=(hash[r]-hash[l-1]*p^{r-l+1}\%mod+mod)\%mod)。所以我们要预处理(p^i)。
防止冲突可以用双(hash),即取两个不同的模数。
学这个主要是为了避免写(kmp)。