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)%p1) + p1) % p1;
- ll y2=1; //multiplier2 calculation
- for (int i = 1; i <= l; i++)
- y2 = (((y2 * m)%p2) + p2) % p2;
- if((H1[a+l]-(y1*H1[a]))%p1!=(H1[b+l]-(y1*H1[b]))%p1) return false;
- if((H2[a+l]-(y2*H2[a]))%p2!=(H2[b+l]-(y2*H2[b]))%p2) return false;
- return true;
- }
- private:
- ll m = 3;
- 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");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement