Advertisement
scottish_esquire

Упражнение 2 с семинара.

Sep 26th, 2022
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5.  
  6. int mod = 1000000007; // наш модуль
  7.  
  8. void forward1 (std::string s, int k, std::vector<int64_t> &hs, std::vector<int64_t> &row) { // хеш-функция, которая считает хеши от префиксов строки
  9.     int64_t h = 0;
  10.     int i = 0;
  11.     for (char c : s) {
  12.         int x = (int) (c - 'a' + 1);
  13.         h = (h + row[i] * x) % mod;
  14.         hs[i] = h;
  15.         i++;
  16.     }
  17. }
  18.  
  19. int hash_subsrt (std::string s, int l, int r, std::vector<int64_t> &hs, std::vector<int64_t> &row, int n) { // функция, которая сравнивает и выдаёт нормальный хеш от подстроки
  20.     if (l - 1 >= 0) {
  21.         return (((hs[r] - hs[l - 1]) * row[n - l + 1]) % mod + mod) % mod;
  22.     } else {
  23.         return (((hs[r]) * row[n - l + 1]) % mod);
  24.     }
  25. }
  26.  
  27.  
  28. int main() {
  29.     std::string s; // наша строка
  30.     int num = 0;
  31.     int k = 31; // наше простое число
  32.     int a1, b1, a2, b2; // границы левые и правые
  33.     std::cin >> s >> num;
  34.     std::vector<bool> ans(num); // наш ответ
  35.     std::vector<int64_t> row(s.length() + 100); // вектор степеней
  36.     row[0] = 1;
  37.     std::vector<int64_t> hs(s.length()); // вектор хешей
  38.     for (size_t i = 1; i < row.size(); i++) {
  39.         row[i] = row[i - 1] * k % mod;
  40.     }
  41.     forward1(s, k, hs, row); // считаем префиксы
  42.     for (size_t j = 0; j < num; j++) {
  43.         std::cin >> a1 >> a2 >> b1 >> b2;
  44.         if (a2 - a1 == b2 - b1) { // проверка на равенство длин подстрок
  45.             if (hash_subsrt(s, a1 - 1, a2 - 1, hs, row, s.length()) == (hash_subsrt(s, b1 - 1, b2 - 1, hs, row, s.length()))) { // сравниваем две подстроки
  46.                 ans[j] = true;
  47.             } else {
  48.                 ans[j] = false;
  49.             }
  50.         } else {
  51.             ans[j] = false;
  52.         }
  53.     }
  54.     for (auto el : ans) { // выводим ответ
  55.         if (el) {
  56.             std::cout << "Yes" << "\n";
  57.         } else {
  58.             std::cout << "No" << "\n";
  59.         }
  60.     }
  61. }
  62.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement