Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- int mod = 1000000007; // наш модуль
- void forward1 (std::string s, int k, std::vector<int64_t> &hs, std::vector<int64_t> &row) { // хеш-функция, которая считает хеши от префиксов строки
- int64_t h = 0;
- int i = 0;
- for (char c : s) {
- int x = (int) (c - 'a' + 1);
- h = (h + row[i] * x) % mod;
- hs[i] = h;
- i++;
- }
- }
- int hash_subsrt (std::string s, int l, int r, std::vector<int64_t> &hs, std::vector<int64_t> &row, int n) { // функция, которая сравнивает и выдаёт нормальный хеш от подстроки
- if (l - 1 >= 0) {
- return (((hs[r] - hs[l - 1]) * row[n - l + 1]) % mod + mod) % mod;
- } else {
- return (((hs[r]) * row[n - l + 1]) % mod);
- }
- }
- int main() {
- std::string s; // наша строка
- int num = 0;
- int k = 31; // наше простое число
- int a1, b1, a2, b2; // границы левые и правые
- std::cin >> s >> num;
- std::vector<bool> ans(num); // наш ответ
- std::vector<int64_t> row(s.length() + 100); // вектор степеней
- row[0] = 1;
- std::vector<int64_t> hs(s.length()); // вектор хешей
- for (size_t i = 1; i < row.size(); i++) {
- row[i] = row[i - 1] * k % mod;
- }
- forward1(s, k, hs, row); // считаем префиксы
- for (size_t j = 0; j < num; j++) {
- std::cin >> a1 >> a2 >> b1 >> b2;
- if (a2 - a1 == b2 - b1) { // проверка на равенство длин подстрок
- if (hash_subsrt(s, a1 - 1, a2 - 1, hs, row, s.length()) == (hash_subsrt(s, b1 - 1, b2 - 1, hs, row, s.length()))) { // сравниваем две подстроки
- ans[j] = true;
- } else {
- ans[j] = false;
- }
- } else {
- ans[j] = false;
- }
- }
- for (auto el : ans) { // выводим ответ
- if (el) {
- std::cout << "Yes" << "\n";
- } else {
- std::cout << "No" << "\n";
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement