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