1、创建Hash表:
若要hash的是字符则 HASH <char> A;
若要hash的是int则 HASH <int> A;
2、hash a数组初始化(首先要保证a数组是 [0, n) 储存的)
A.init(a, n);
得到的结果是[1,n] 。
3、得到a数组某段区间的hash值
如:想要获得a数组[0,n)的hash值 ,则 A.get(1, n);
想要获得a数组[0,5]的hash值 ,则 A.get(1, 6);
const int N = 200105;
typedef long long ll;
const int MAGIC = 311, MOD = 1e9 + 7;
template <class T>
struct HASH{
ll h[N], base[N];
inline void init(T *s, int len) {
h[0] = 0;
for (int i = 1; i <= len; ++i) h[i] = (h[i - 1] * MAGIC % MOD + s[i - 1]) % MOD;
base[0] = 1;
for (int i = 1; i <= len; ++i) base[i] = (base[i - 1] * MAGIC) % MOD;
}
inline long long get(int l, int r) {
return (h[r] - h[l - 1] * base[r - l + 1] % MOD + MOD) % MOD;
}
};
HASH <int>A, B;