字符串哈希代码简单,思想也很好理解,在处理一些字符串问题时,非常之有效。
其精髓就是一个在unsigned long long范围内的哈希函数
typedef unsigned long long ULL;
const int maxn=10000;
const int x=123; //hash函数的参数
ULL H[maxn]; //字符串hash值
ULL xp[maxn]; //x的n次幂
void hash_init(char *s) //初始化H(n),x^n
{
int n=strlen(s);
H[n]=0;
for(int i=n-1;i>=0;i--) H[i]=H[i+1]*x+(s[i]-'a'); //递推H(n)
xp[0]=1;
for(int i=1;i<=n;i++) xp[i]=xp[i-1]*x; //递推X^n
}
ULL hash(int i,int L) //hash函数,返回起点为i,长度为L的hash值。
{
return H[i]-H[i+L]*xp[L];
}
如果要比较两个字符串是否相等时,只需要直接比较其hash值即可,非常方便。