字符串--字符串hash
字符串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) \times base^{r-l+1}\)
比如说\(123456\),我要求\([3,5]\)的\(hash\)值
也就是用\(12345-12000 = 345\)