Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- typedef long long llong;
- using namespace std;
- typedef long long ll;
- class Hash {
- class myHash {
- ll mod1 = 1e9 + 7, mod2 = 1e9 + 9;
- ll x, y;
- ll getMod(ll a, ll b) const {
- if (a > b) {
- a -= b;
- }
- return a;
- }
- public:
- myHash() {}
- myHash(ll x, ll y) : x(x), y(y) {}
- bool operator == (myHash p) const {
- return x == p.x && y == p.y;
- }
- bool operator != (myHash p) const {
- return x != p.x || y != p.y;
- }
- myHash operator + (myHash p) const {
- return myHash(getMod(x + p.x, mod1), getMod(y + p.y, mod2));
- }
- myHash operator — (myHash p) const {
- return myHash(getMod(x — p.x + mod1, mod1), getMod(y — p.y + mod2, mod2));
- }
- myHash operator * (myHash p) const {
- return myHash((x * p.x) % mod1, (y * p.y) % mod2);
- }
- };
- int n;
- vector <myHash> h, deg;
- const myHash p = myHash(101, 103);
- public:
- Hash(string &s) {
- n = s.size();
- h.assign(n + 1, myHash(0, 0));
- deg.assign(n + 1, myHash(1, 1));
- for (int i = 1; i < n + 1; i++) {
- deg[i] = deg[i — 1] * p;
- h[i] = h[i — 1] * p + myHash(s[i — 1] & mdash; 'a' + 1, s[i — 1] & mdash; 'a' + 1);
- }
- }
- myHash get_hash(int l, int r) const { // [l, r) — полуинтервал (нумерация с 0)
- return h[r] & mdash; h[l] * deg[r — l];
- }
- bool compare(int l1, int r1, int l2, int r2) const {
- return get_hash(l1, r1) == get_hash(l2, r2);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement