Advertisement
Ta7a99

Untitled

May 16th, 2020
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.66 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);
  25.         ll y2 = 1; //multiplier2 calculation
  26.         for (int i = 1; i <= l; i++)
  27.             y2 = (y2 * m);
  28.         if(l==0) return true;
  29.         if (a == 0 && b == 0)
  30.         {
  31.             if ((H1[a + l - 1]) % p1 != (H1[b + l - 1]) % p1)
  32.                 return false;
  33.             if ((H2[a + l - 1]) % p2 != (H2[b + l - 1]) % p2)
  34.                 return false;
  35.         }
  36.         else if (a == 0)
  37.         {
  38.             if ((H1[a + l - 1]) % p1 != (H1[b + l - 1] - (y1 * H1[b - 1])) % p1)
  39.                 return false;
  40.             if ((H2[a + l - 1]) % p2 != (H2[b + l - 1] - (y2 * H2[b - 1])) % p2)
  41.                 return false;
  42.         }
  43.         else if (b == 0)
  44.         {
  45.             if ((H1[a + l - 1] - (y1 * H1[a - 1])) % p1 != (H1[b + l - 1]) % p1)
  46.                 return false;
  47.             if ((H2[a + l - 1] - (y2 * H2[a - 1])) % p2 != (H2[b + l - 1]) % p2)
  48.                 return false;
  49.         }
  50.         else
  51.         {
  52.             if ((H1[a + l - 1] - (y1 * H1[a - 1])) % p1 != (H1[b + l - 1] - (y1 * H1[b - 1])) % p1)
  53.                 return false;
  54.             if ((H2[a + l - 1] - (y2 * H2[a - 1])) % p2 != (H2[b + l - 1] - (y2 * H2[b - 1])) % p2)
  55.                 return false;
  56.         }
  57.         bool flag = true;
  58.         for (int j = a, k = b, cnt = 0; cnt < l; cnt++, j++, k++)
  59.             if (s[j] != s[k])
  60.             {
  61.                 flag = false;
  62.                 break;
  63.             }
  64.         return flag;
  65.     }
  66.     bool askNaive(int a, int b, int l)
  67.     {
  68.         bool flag = true;
  69.         for (int j = a, k = b, cnt = 0; cnt < l; cnt++, j++, k++)
  70.             if (s[j] != s[k])
  71.             {
  72.                 flag = false;
  73.                 break;
  74.             }
  75.         return flag;
  76.     }
  77.  
  78. private:
  79.     ll m = 1;
  80.     ll p1 = 1000000009;
  81.     ll p2 = 1000000007;
  82.     void PrecomputeHashes(int n)
  83.     {
  84.         H1.resize(n);
  85.         H2.resize(n);
  86.         H1[0] = 0;
  87.         H2[0] = 0;
  88.         for (int j = 1; j < n; j++)
  89.         {
  90.             H1[j] = (((m * H1[j - 1] + s[j]) % p1) + p1) % p1;
  91.             H2[j] = (((m * H2[j - 1] + s[j]) % p2) + p2) % p2;
  92.         }
  93.     }
  94. };
  95.  
  96. int main()
  97. {
  98.     ios_base::sync_with_stdio(0), cin.tie(0);
  99.  
  100.     string s;
  101.     int q;
  102.     cin >> s /*>> q*/;
  103.     Solver solver(s);
  104.     /*for (int i = 0; i < q; i++)
  105.     {
  106.         int a, b, l;
  107.         cin >> a >> b >> l;
  108.         cout << (solver.ask(a, b, l) ? "Yes\n" : "No\n");
  109.     }*/
  110.     for (int i = 0; i < 150; i++)
  111.     {
  112.         int a, b, l;
  113.         //cin >> a >> b >> l;
  114.         a = rand() % s.size();
  115.         b = rand() % s.size();
  116.         l = rand() % (s.size() - max(a, b) + 1);
  117.         //cout << (solver.ask(a, b, l) ? "Yes\n" : "No\n");
  118.         if (solver.ask(a, b, l) == solver.askNaive(a, b, l))
  119.             puts("correct");
  120.         else
  121.         {
  122.             puts("wrong");
  123.             cout << a << " " << b << " " << l << endl;
  124.         }
  125.     }
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement