class XDCHash {
typedef unsigned long long int ull;
public:
XDCHash() :m_hashBase(131ull), m_hashMode(998244353ull), m_boInit(false) {}
XDCHash(ull base, ull mod) :m_hashBase(base), m_hashMode(mod), m_boInit(false) {}
void Init(int n) {
P.assign(n + 1, 1);
for (int i = 0; i < n; i++) {
P[i + 1] = P[i] * m_hashBase % m_hashMode;
}
m_boInit = true;
}
ull Hash(string& input) {
int len = input.size();
if (!m_boInit)Init(len);
H.assign(len + 1, 0);
for (int i = 0; i < len; i++) {
H[i + 1] = (H[i] * m_hashBase + input[i]) % m_hashMode;
}
return H.back();
}
ull HashHalf(int l, int r) {
ull a = H[r + 1];
ull b = H[l] * P[r - l + 1] % m_hashMode;
return (a - b + m_hashMode) % m_hashMode;
}
public:
vector<ull> P, H;
bool m_boInit;
ull m_hashBase, m_hashMode;
};
class XDCHash2 {
typedef unsigned long long int ull;
public:
XDCHash2() :h1(131ull, 998244353ull), h2(307, 95911007) {}
pair<ull, ull> Hash(string& input) {
return { h1.Hash(input) ,h2.Hash(input) };
}
pair<ull, ull> HashHalf(int l, int r) {
return { h1.HashHalf(l,r) ,h2.HashHalf(l,r) };
}
private:
XDCHash h1;
XDCHash h2;
};
字符串哈希
于 2022-10-06 16:33:27 首次发布