cincout

Хэши

Jun 18th, 2019
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. ll mod = 1e9 + 7;
  2. ll base = 239017;
  3. ll st[N];
  4.  
  5. ll mul(ll a, ll b) {
  6. return (a * b) % mod;
  7. }
  8.  
  9. ll add(ll a, ll b) {
  10. return (a + b + mod) % mod;
  11. }
  12.  
  13.  
  14. void prec() {
  15. st[0] = 1;
  16. for (int i = 1; i < N; ++i)
  17. st[i] = mul(st[i - 1], base);
  18. }
  19.  
  20. struct Hash {
  21. vector <ll> imp;
  22. Hash() {
  23.  
  24. }
  25. ll value() {
  26. assert(imp.size());
  27. return imp.back();
  28. }
  29. Hash(vector<ll> s) {
  30. imp.resize(s.size());
  31. imp[0] = s[0];
  32. for (int i = 1; i < imp.size(); ++i) {
  33. imp[i] = add(mul(imp[i - 1], base), s[i]);
  34. }
  35. }
  36. void init(vector<ll> s) {
  37. imp.resize(s.size());
  38. imp[0] = s[0];
  39. for (int i = 1; i < imp.size(); ++i) {
  40. imp[i] = add(mul(imp[i - 1], base), s[i]);
  41. }
  42. }
  43. ll get_pref(int num) {
  44. if (num < 0)
  45. return 0;
  46. return imp[num];
  47. }
  48. ll get_seg(int l, int r) {
  49. return add(get_pref(r), -mul(get_pref(l - 1), st[r - l + 1]));
  50. }
  51. };
  52.  
  53. ll slay(ll le, ll re, int sz)
  54. {
  55. return add(mul(le, pw[sz]), re);
  56. }
  57.  
  58. const ll base = 239017;
  59. const ll N = 2e6;
  60.  
  61. ll mod[2] = {2971215073, 1000000007};
  62.  
  63. ll pw[N][2];
  64.  
  65. ll mul(ll a, ll b, int f)
  66. {
  67. return (a * b) % mod[f];
  68. }
  69.  
  70. ll add(ll a, ll b, int f)
  71. {
  72. ll res = a + b;
  73. if (res < 0)
  74. res += mod[f];
  75. return res % mod[f];
  76. }
  77.  
  78. void prec()
  79. {
  80. pw[0][0] = pw[0][1] = 1;
  81. for (int i = 1; i < N; ++i) {
  82. pw[i][0] = mul(pw[i - 1][0], base, 0);
  83. pw[i][1] = mul(pw[i - 1][1], base, 1);
  84. }
  85. }
  86.  
  87. struct Hash {
  88. vector <pair<ll, ll>> imp;
  89. Hash()
  90. {
  91.  
  92. }
  93. pair<ll, ll> value()
  94. {
  95. assert(imp.size());
  96. return imp.back();
  97. }
  98. Hash(string s)
  99. {
  100. imp.resize(s.size());
  101. imp[0].first = imp[0].second = s[0];
  102. for (int i = 1; i < imp.size(); ++i) {
  103. imp[i].first = add(mul(imp[i - 1].first, base, 0), s[i], 0);
  104. imp[i].second = add(mul(imp[i - 1].second, base, 1), s[i], 1);
  105. }
  106. }
  107. void init(string s)
  108. {
  109. imp.resize(s.size());
  110. imp[0].first = imp[0].second = s[0];
  111. for (int i = 1; i < imp.size(); ++i) {
  112. imp[i].first = add(mul(imp[i - 1].first, base, 0), s[i], 0);
  113. imp[i].second = add(mul(imp[i - 1].second, base, 1), s[i], 1);
  114. }
  115. }
  116. pair<ll, ll> get_pref(int num)
  117. {
  118. if (num < 0)
  119. return make_pair(0, 0);
  120. return imp[num];
  121. }
  122. pair<ll, ll> get_seg(int l, int r)
  123. {
  124. return make_pair(add(get_pref(r).first, -mul(get_pref(l - 1).first, pw[r- l + 1][0], 0), 0), add(get_pref(r).second, -mul(get_pref(l - 1).second, pw[r- l + 1][1], 1), 1));
  125. }
  126. };
Add Comment
Please, Sign In to add comment