宏定义
#define ull unsigned long long:Hash 时常用 unsigned long long 类型。
常量和变量
- const ull
P:求 Hash 值时用的模数,通常为大质数。
- const ull
mod:将得到的 Hash 值取模在 mod 以内,一般不用,直接对 264 取模,自动溢出。
- char
ji:字符集的最小字符,通常为 0、a 或 A,用于把字符化为整数。
函数
- ull
qmi(int a):快速幂,求 Pa。
- ull
ask(string s):求 S 的 Hash 值。
- ull
jia(ull a,ull b,int b_size):求 Hash 值为 a 的字符串 A 和 Hash 值为 b、长度为 b_size 的字符串 B 的拼接 AB。
- ull
jian(ull a,ull b,int s_size):已知 Hash 值为 a 的字符串 AB 和 Hash 值为 b、长度为 s_size 的字符串 A,求 B 的 Hash 值。
#define ull unsigned long long
struct Hash{
const ull P=13331;
char ji='a';
ull qmi(int a){
ull ans=1,b=P;
while(a){
if(a&1)
ans*=b;
b=b*b;
a>>=1;
}
return ans;
}
ull ask(string s){
ull f=int(s[0]-ji);
int l=s.size();
for(int i=1;i<l;i++){
f=f*P;
f+=int(s[i]-ji);
}
return f;
}
ull jia(ull a,ull b,int b_size){
return a*qmi(b_size)+b;
}
ull jian(ull a,ull b,int s_size){
return a-b*qmi(s_size);
}
};