Guest User

Untitled

a guest
Jul 21st, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. typedef long long ll;
  3. typedef std::tuple<ll, ll, ll> hash_t;
  4.  
  5. using namespace std;
  6.  
  7. ll power(ll a,ll b,ll m){
  8. if(a==0) return 0;
  9. if(b==0) return 1;
  10. if(b==1) return a;
  11. if(b%2) return (power((a*a)%m,b/2,m)*a)%m;
  12. return power((a*a)%m,b/2,m);
  13. }
  14.  
  15. class RollingHash {
  16. hash_t p = {151, 503, 47};
  17. hash_t hashes = {0, 0, 0};
  18. hash_t pows = {1, 1, 1};
  19. hash_t mods = {916192396117594829LL, 182964847282097359LL, 288894744815098423LL};
  20.  
  21. public:
  22. void add(ll x) {
  23. get<0>(pows) = (get<0>(pows) * get<0>(p)) % get<0>(mods);
  24. get<0>(hashes) = (get<0>(hashes) + (x + 1) * get<0>(pows)) % get<0>(mods);
  25. get<1>(pows) = (get<1>(pows) * get<1>(p)) % get<1>(mods);
  26. get<1>(hashes) = get<1>(hashes) + (x + 1) * get<1>(pows) % get<1>(mods);
  27. get<2>(pows) = (get<2>(pows) * get<2>(p)) % get<2>(mods);
  28. get<2>(hashes) = get<2>(hashes) + (x + 1) * get<2>(pows) % get<2>(mods);
  29. }
  30. void remove(ll x) {
  31. ll inverseP0 = power(get<0>(p), get<0>(mods)-2, get<0>(mods)),
  32. inverseP1 = power(get<1>(p), get<1>(mods)-2, get<1>(mods)),
  33. inverseP2 = power(get<2>(p), get<2>(mods)-2, get<2>(mods));
  34.  
  35. get<0>(hashes) = (get<0>(hashes) - (x + 1) * get<0>(p) + get<0>(mods)) % get<0>(mods);
  36. get<0>(hashes) *= inverseP0;
  37. get<0>(hashes) %= get<0>(mods);
  38. get<0>(pows) = (get<0>(pows) * inverseP0) % get<0>(mods);
  39.  
  40. get<1>(hashes) = (get<1>(hashes) - (x + 1) * get<1>(p) + get<1>(mods)) % get<1>(mods);
  41. get<1>(hashes) *= inverseP1;
  42. get<1>(hashes) %= get<1>(mods);
  43. get<1>(pows) = (get<1>(pows) * inverseP1) % get<1>(mods);
  44.  
  45. get<2>(hashes) = (get<2>(hashes) - (x + 1) * get<2>(p) + get<2>(mods)) % get<2>(mods);
  46. get<2>(hashes) *= inverseP2;
  47. get<2>(hashes) %= get<2>(mods);
  48. get<2>(pows) = (get<2>(pows) * inverseP2) % get<2>(mods);
  49. }
  50. auto getHash() { return hashes; }
  51. auto getPows() { return pows; }
  52. };
Add Comment
Please, Sign In to add comment