4eyes4u

Rolling hash

Mar 27th, 2016
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. typedef long long ll;
  3. using namespace std;
  4.  
  5. const ll p=367;
  6. const ll mod=1e9+7;
  7. const ll N=1e5+10;
  8.  
  9. char s[N];
  10. ll h[N], g[N], deg[N], inv[N];
  11. int l, r, q;
  12.  
  13. ll mod_pow (ll num, ll pw)
  14. {
  15.     ll ret=1;
  16.     while (pw)
  17.     {
  18.         if (pw&1) ret=(ret*num)%mod;
  19.         pw>>=1;
  20.         num=(num*num)%mod;
  21.     }
  22.     return ret;
  23. }
  24.  
  25. ll mod_inv (ll num)
  26. {
  27.     return mod_pow(num, mod-2);
  28. }
  29.  
  30. void rolling (int n)
  31. {
  32.     deg[0]=1; inv[0]=1;
  33.     deg[1]=p; inv[1]=mod_inv(p);
  34.     h[0]=s[0]-'a';
  35.     g[n-1]=s[n-1]-'a';
  36.     for (int i=2;i<n;i++)
  37.     {
  38.         deg[i]=(deg[i-1]*deg[1])%mod;
  39.         inv[i]=(inv[i-1]*inv[1])%mod;
  40.     }
  41.     for (int i=1;i<n;i++) h[i]=(h[i-1]+(deg[i]*(s[i]-'a')%mod))%mod;
  42.     for (int i=n-2;i>=0;i--) g[i]=(g[i+1]+(deg[n-1-i]*(s[i]-'a')%mod))%mod;
  43. }
  44.  
  45. bool check (int l, int r, int n)
  46. {
  47.     ll fi=(((h[r]-h[l-1]+mod)%mod)*inv[l])%mod;
  48.     ll se=(((g[l]-g[r+1]+mod)%mod)*inv[n-r])%mod;
  49.     cout << fi << " " << se << endl;
  50.     return (fi==se);
  51. }
  52.  
  53. int main()
  54. {
  55.     scanf ("%s", s);
  56.     int n=strlen(s);
  57.  
  58.     rolling(n);
  59.  
  60.     scanf ("%d", &q);
  61.     while (q--)
  62.     {
  63.         scanf ("%d%d", &l, &r);
  64.         printf ("%d\n", check(l-1, r-1, n-1));
  65.     }
  66.  
  67.     return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment