Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.43 KB | None | 0 0
  1. typedef long long llong;
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. class Hash {
  8. class myHash {
  9. ll mod1 = 1e9 + 7, mod2 = 1e9 + 9;
  10. ll x, y;
  11. ll getMod(ll a, ll b) const {
  12. if (a > b) {
  13. a -= b;
  14. }
  15. return a;
  16. }
  17. public:
  18. myHash() {}
  19. myHash(ll x, ll y) : x(x), y(y) {}
  20. bool operator == (myHash p) const {
  21. return x == p.x && y == p.y;
  22. }
  23. bool operator != (myHash p) const {
  24. return x != p.x || y != p.y;
  25. }
  26. myHash operator + (myHash p) const {
  27. return myHash(getMod(x + p.x, mod1), getMod(y + p.y, mod2));
  28. }
  29. myHash operator — (myHash p) const {
  30. return myHash(getMod(x — p.x + mod1, mod1), getMod(y — p.y + mod2, mod2));
  31. }
  32. myHash operator * (myHash p) const {
  33. return myHash((x * p.x) % mod1, (y * p.y) % mod2);
  34. }
  35. };
  36. int n;
  37. vector <myHash> h, deg;
  38. const myHash p = myHash(101, 103);
  39. public:
  40. Hash(string &s) {
  41. n = s.size();
  42. h.assign(n + 1, myHash(0, 0));
  43. deg.assign(n + 1, myHash(1, 1));
  44. for (int i = 1; i < n + 1; i++) {
  45. deg[i] = deg[i &mdash; 1] * p;
  46. h[i] = h[i &mdash; 1] * p + myHash(s[i &mdash; 1] & mdash; 'a' + 1, s[i &mdash; 1] & mdash; 'a' + 1);
  47. }
  48. }
  49. myHash get_hash(int l, int r) const { // [l, r) &mdash; полуинтервал (нумерация с 0)
  50. return h[r] & mdash; h[l] * deg[r &mdash; l];
  51. }
  52. bool compare(int l1, int r1, int l2, int r2) const {
  53. return get_hash(l1, r1) == get_hash(l2, r2);
  54. }
  55. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement