Advertisement
Ta7a99

substrings hashing

May 16th, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include<cmath>
  4.  
  5. typedef long long ll;
  6. using namespace std;
  7. vector<ll> H1;
  8. vector<ll> H2;
  9.  
  10. class Solver
  11. {
  12.     string s;
  13.  
  14. public:
  15.     Solver(string s) : s(s)
  16.     {
  17.         // initialization, precalculation
  18.         PrecomputeHashes(s.size());
  19.     }
  20.     bool ask(int a, int b, int l)
  21.     {
  22.         ll y1=1; //multiplier1 calculation
  23.         for (int i = 1; i <= l; i++)
  24.             y1 = (((y1 * m)%p1) + p1) % p1;
  25.         ll y2=1; //multiplier2 calculation
  26.         for (int i = 1; i <= l; i++)
  27.             y2 = (((y2 * m)%p2) + p2) % p2;
  28.         if((H1[a+l]-(y1*H1[a]))%p1!=(H1[b+l]-(y1*H1[b]))%p1) return false;
  29.         if((H2[a+l]-(y2*H2[a]))%p2!=(H2[b+l]-(y2*H2[b]))%p2) return false;
  30.         return true;
  31.     }
  32.  
  33. private:
  34.     ll m = 3;
  35.     ll p1 = 1000000009;
  36.     ll p2 = 1000000007;
  37.     void PrecomputeHashes(int n)
  38.     {
  39.         H1.resize(n);
  40.         H2.resize(n);
  41.         H1[0] = 0;
  42.         H2[0] = 0;
  43.         for (int j = 1; j < n; j++)
  44.         {
  45.             H1[j] = (((m * H1[j - 1] + s[j]) % p1) + p1) % p1;
  46.             H2[j] = (((m * H2[j - 1] + s[j]) % p2) + p2) % p2;
  47.         }
  48.     }
  49. };
  50.  
  51. int main()
  52. {
  53.     ios_base::sync_with_stdio(0), cin.tie(0);
  54.  
  55.     string s;
  56.     int q;
  57.     cin >> s >> q;
  58.     Solver solver(s);
  59.     for (int i = 0; i < q; i++)
  60.     {
  61.         int a, b, l;
  62.         cin >> a >> b >> l;
  63.         cout << (solver.ask(a, b, l) ? "Yes\n" : "No\n");
  64.     }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement