Advertisement
Mlxa

ALGO Back-polynom Reversible String Hash

Nov 30th, 2017
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.95 KB | None | 0 0
  1. #include <iostream>
  2. #include  <string>
  3. using namespace std;
  4. typedef signed long long ll;
  5. typedef   unsigned  long ui;
  6.  
  7. const ll MaxN(19091), mul(7), mod(19e6+7); ll deg[MaxN] = {1};
  8. struct subcmp {
  9.     char str[MaxN], rtr[MaxN]; ui size;
  10.     ll suff[MaxN] = {}, pref[MaxN] = {};
  11.     void get_deg() {
  12.         for (ll* i(deg + 1); i < deg + size + 19; ++i)
  13.             *i = (*(i - 1) * mul) % mod;
  14.     }
  15.     subcmp (string& s) {
  16.         size = s.size(); get_deg();
  17.         for (ui i(0); i < size; ++i)
  18.             str[i] = rtr[size-i-1] = s[i];
  19.         for (ui i(0); i < size; ++i)
  20.             pref[i + 1] = (pref[i] * mul + str[i]) % mod,
  21.             suff[i + 1] = (suff[i] * mul + rtr[i]) %mod;
  22.     }
  23.     ll get (ll i, ll j, bool rev) {
  24.         if (rev)    value = suff[size-j] - suff[size-i-1] * deg[i-j+1];
  25.         else        value = pref[j + 1] - pref[i] * deg[j-i+1];
  26.         while (value < 0) value += mod;
  27.         return value;
  28.     }
  29. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement