summaryrefslogtreecommitdiff
path: root/string/rollingHash.cpp
blob: 0df4c871c43f3f2838e1c85dc8c24be14c4e1b9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ll q = 31; // Größer als Alphabetgröße. q=31,53,311
struct Hasher {
  string s;
  ll mod;
  vector<ll> power, pref;
  Hasher(const string& s, ll mod) : s(s), mod(mod) {
    power.push_back(1);
    for (int i = 1; i < (int)s.size(); i++)
      power.push_back(power.back() * q % mod);
    pref.push_back(0);
    for (int i = 0; i < (int)s.size(); i++)
      pref.push_back((pref.back() * q % mod + s[i]) % mod);
  }

  // Berechnet hash(s[l..r]). l,r inklusive.
  ll hash(int l, int r) {
    return (pref[r+1] - power[r-l+1] * pref[l] % mod + mod) % mod;
  }
};