字符串hash
就是把一个字符串转换成整数
可以理解成有一个函数,输入一个字符串,输出一个整数
而我们要做的就是构造这么一个函数,使得不同的(x)对应不同的(y)
首先我们选取一个(base)做为要转换的进制数,然后选取一个恰当的余数(M)(减少(hash)冲突)
code
int base = 27;
int M = 1e9+7;
int hash(string s)
{
int len = s.size();
int res = 0;
for(int i = 0; i < len; i++)
{
res = (res*base + (s[i]-'a'+1))%M;
}
return res;
}
注意事项
不要把任意字符对应(0),如果把(a)对应(0),那么(ab)和(b)的(hash)值相等,就造成了冲突
进制的选取,大于所有字符对应数字的最大值,不要含有模数的因子
模数尽量选取质数
也可以使用unsigned long long,当溢出时自动对(2^{64})取模
ull hashs(char s[])
{
int len=strlen(s);
ull ans=0;
for (int i=0;i<len;i++)
ans=ans*base+(ull)s[i]; //自动溢出
return ans&0x7fffffff; //取正
}
求[l,r]的hash值
可以利用(hash(r)-hash(l-1) imes base^{r-l+1})
比如说(123456),我要求([3,5])的(hash)值
也就是用(12345-12000 = 345)