Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cmath>
- typedef long long ll;
- using namespace std;
- vector<ll> H1;
- vector<ll> H2;
- class Solver
- {
- string s;
- public:
- Solver(string s) : s(s)
- {
- // initialization, precalculation
- PrecomputeHashes(s.size());
- }
- bool ask(int a, int b, int l)
- {
- ll y1 = 1; //multiplier1 calculation
- for (int i = 1; i <= l; i++)
- y1 = (y1 * m);
- ll y2 = 1; //multiplier2 calculation
- for (int i = 1; i <= l; i++)
- y2 = (y2 * m);
- if(l==0) return true;
- if (a == 0 && b == 0)
- {
- if ((H1[a + l - 1]) % p1 != (H1[b + l - 1]) % p1)
- return false;
- if ((H2[a + l - 1]) % p2 != (H2[b + l - 1]) % p2)
- return false;
- }
- else if (a == 0)
- {
- if ((H1[a + l - 1]) % p1 != (H1[b + l - 1] - (y1 * H1[b - 1])) % p1)
- return false;
- if ((H2[a + l - 1]) % p2 != (H2[b + l - 1] - (y2 * H2[b - 1])) % p2)
- return false;
- }
- else if (b == 0)
- {
- if ((H1[a + l - 1] - (y1 * H1[a - 1])) % p1 != (H1[b + l - 1]) % p1)
- return false;
- if ((H2[a + l - 1] - (y2 * H2[a - 1])) % p2 != (H2[b + l - 1]) % p2)
- return false;
- }
- else
- {
- if ((H1[a + l - 1] - (y1 * H1[a - 1])) % p1 != (H1[b + l - 1] - (y1 * H1[b - 1])) % p1)
- return false;
- if ((H2[a + l - 1] - (y2 * H2[a - 1])) % p2 != (H2[b + l - 1] - (y2 * H2[b - 1])) % p2)
- return false;
- }
- bool flag = true;
- for (int j = a, k = b, cnt = 0; cnt < l; cnt++, j++, k++)
- if (s[j] != s[k])
- {
- flag = false;
- break;
- }
- return flag;
- }
- bool askNaive(int a, int b, int l)
- {
- bool flag = true;
- for (int j = a, k = b, cnt = 0; cnt < l; cnt++, j++, k++)
- if (s[j] != s[k])
- {
- flag = false;
- break;
- }
- return flag;
- }
- private:
- ll m = 1;
- ll p1 = 1000000009;
- ll p2 = 1000000007;
- void PrecomputeHashes(int n)
- {
- H1.resize(n);
- H2.resize(n);
- H1[0] = 0;
- H2[0] = 0;
- for (int j = 1; j < n; j++)
- {
- H1[j] = (((m * H1[j - 1] + s[j]) % p1) + p1) % p1;
- H2[j] = (((m * H2[j - 1] + s[j]) % p2) + p2) % p2;
- }
- }
- };
- int main()
- {
- ios_base::sync_with_stdio(0), cin.tie(0);
- string s;
- int q;
- cin >> s /*>> q*/;
- Solver solver(s);
- /*for (int i = 0; i < q; i++)
- {
- int a, b, l;
- cin >> a >> b >> l;
- cout << (solver.ask(a, b, l) ? "Yes\n" : "No\n");
- }*/
- for (int i = 0; i < 150; i++)
- {
- int a, b, l;
- //cin >> a >> b >> l;
- a = rand() % s.size();
- b = rand() % s.size();
- l = rand() % (s.size() - max(a, b) + 1);
- //cout << (solver.ask(a, b, l) ? "Yes\n" : "No\n");
- if (solver.ask(a, b, l) == solver.askNaive(a, b, l))
- puts("correct");
- else
- {
- puts("wrong");
- cout << a << " " << b << " " << l << endl;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement