Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. struct hsh {
  2. ll base, p1, p2;
  3.  
  4. ll val1, val2;
  5. deque<ll> vals;
  6.  
  7. ll inv1, inv2;
  8.  
  9. ll modExp(ll power, ll prime) {
  10. if (power == 0) {
  11. return 1;
  12. } else {
  13. ll cur = modExp(power / 2, prime); cur = cur * cur; cur = cur % prime;
  14. if (power % 2 == 1) cur = cur * base;
  15. cur = cur % prime;
  16. return cur;
  17. }
  18. }
  19.  
  20. hsh() {
  21. }
  22.  
  23. hsh(ll b, ll x, ll y) {
  24. base = b;
  25. p1 = x;
  26. p2 = y;
  27. val1 = 0;
  28. val2 = 0;
  29.  
  30. inv2 = modExp(p2-2, p2);
  31. inv1 = modExp(p1-2, p1);
  32. }
  33.  
  34. hsh(ll b) {
  35. p1 = 1000000007;
  36. p2 = 1000000009;
  37. base = b;
  38. val1 = 0;
  39. val2 = 0;
  40.  
  41. inv2 = modExp(p2-2, p2);
  42. inv1 = modExp(p1-2, p1);
  43. }
  44.  
  45. hsh(ll b, string S) {
  46. p1 = 1000000007;
  47. p2 = 1000000009;
  48. base = b;
  49. val1 = 0;
  50. val2 = 0;
  51.  
  52. inv2 = modExp(p2-2, p2);
  53. inv1 = modExp(p1-2, p1);
  54. F0R(i, sz(S)) {
  55. push_back(S[i] - 'a');
  56. }
  57. }
  58.  
  59. void push_back(ll v) {
  60. val1 *= base;
  61. val1 %= p1;
  62. val1 += v;
  63. val1 %= p1;
  64. val2 *= base;
  65. val2 %= p2;
  66. val2 += v;
  67. val2 %= p2;
  68.  
  69. vals.push_back(v);
  70. }
  71.  
  72. void pop_back() {
  73. ll cur = vals.back();
  74. vals.pop_back();
  75.  
  76. val1 += p1 - cur; val1 %= p1;
  77. val1 = val1 * inv1; val1 %= p1;
  78.  
  79. val2 += p2 - cur; val2 %= p2;
  80. val2 = val2 * inv2; val2 %= p2;
  81. }
  82.  
  83. void push_front(ll v) {
  84. val1 += v * modExp(sz(vals), p1);
  85. val1 %= p1;
  86.  
  87. val2 += v * modExp(sz(vals), p2);
  88. val2 %= p2;
  89.  
  90. vals.push_front(v);
  91. }
  92.  
  93. void pop_front() {
  94. ll v = vals.front();
  95. vals.pop_front();
  96. ll sub1 = (v * modExp(sz(vals), p1)) % p1;
  97. val1 += p1 - sub1; val1 %= p1;
  98.  
  99. ll sub2 = (v * modExp(sz(vals), p2)) % p2;
  100. val2 += p2 - sub2; val2 %= p2;
  101.  
  102. }
  103.  
  104. bool operator==(const hsh &v) const {
  105. return (val1 == v.val1 && val2 == v.val2 && sz(vals) == sz(v.vals));
  106. }
  107.  
  108. bool operator<(const hsh &v) const {
  109. if (val1 == v.val1 && val2 == v.val2) {
  110. return sz(vals) < sz(v.vals);
  111. } else if (val1 == v.val1) {
  112. return val2 < v.val2;
  113. }
  114. return val1 < v.val1;
  115. }
  116.  
  117. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement