Advertisement
mfgnik

Untitled

Nov 18th, 2020
821
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <algorithm>
  5. #include <string>
  6.  
  7. #define int long long
  8.  
  9. int add(int a, int b, int mod) {
  10.     return (a + b) % mod;
  11. }
  12.  
  13. int sub(int a, int b, int mod) {
  14.     return ((a - b) % mod + mod) % mod;
  15. }
  16.  
  17. int mull(int a, int b, int mod) {
  18.     return (a * b) % mod;
  19. }
  20.  
  21. std::pair<int, int>
  22. GetHash(int l, int r, std::vector<std::pair<int, int>> &hashes, std::vector<int> &powers, std::vector<int> &powers_2,
  23.         int m, int m_2) {
  24.     return std::make_pair(sub(hashes[r + 1].first, mull(hashes[l].first, powers[r - l + 1], m), m),
  25.                           sub(hashes[r + 1].second, mull(hashes[l].second, powers_2[r - l + 1], m_2), m_2));
  26. }
  27.  
  28. int32_t main() {
  29.     std::string b;
  30.     std::cin >> b;
  31.     int p = 10, m = 1000000000 + 21, m_2 = 998244353;
  32.     std::vector<int> powers((int) b.size() + 1), powers_2((int) b.size() + 1), rev_powers(
  33.             (int) b.size() + 1), rev_powers_2((int) b.size() + 1);
  34.     std::vector<std::pair<int, int>> hashes((int) b.size() + 1), rev_hashes((int) b.size() + 1);
  35.     hashes[0].first = 0;
  36.     powers[0] = 1;
  37.     hashes[0].second = 0;
  38.     powers_2[0] = 1;
  39.     rev_powers[0] = 1;
  40.     rev_powers_2[0] = 1;
  41.  
  42.     for (int i = 0; i < (int) b.size(); ++i) {
  43.         hashes[i + 1].first = add(mull(hashes[i].first, p, m), b[i], m);
  44.         powers[i + 1] = mull(powers[i], p, m);
  45.         hashes[i + 1].second = add(mull(hashes[i].second, p, m_2), b[i], m_2);
  46.         powers_2[i + 1] = mull(powers_2[i], p, m_2);
  47.     }
  48.     std::reverse(b.begin(), b.end());
  49.     for (int i = 0; i < (int) b.size(); ++i) {
  50.         rev_hashes[i + 1].first = add(mull(rev_hashes[i].first, p, m), b[i], m);
  51.         rev_powers[i + 1] = mull(rev_powers[i], p, m);
  52.         rev_hashes[i + 1].second = add(mull(rev_hashes[i].second, p, m_2), b[i], m_2);
  53.         rev_powers_2[i + 1] = mull(rev_powers_2[i], p, m_2);
  54.     }
  55.     int size = static_cast<int>(b.size());
  56.     for (int i = 0; i < size; ++i) {
  57.         int l = 0, r = std::min(i, size - i - 1) + 1;
  58.         while (r - l > 1) {
  59.             int current_val = (r + l + 1) / 2;
  60.             int left_index = i - current_val, right_index = i - 1;
  61.             int reversed_left_index = size - 1 - i - current_val, reversed_right_index = size - i - 2;
  62.             auto a_1 = GetHash(left_index, right_index, hashes, powers, powers_2, m, m_2);
  63.             auto a_2 = GetHash(reversed_left_index, reversed_right_index, rev_hashes, rev_powers, rev_powers_2, m, m_2);
  64.  
  65.             if (a_1 == a_2) {
  66.                 l = current_val;
  67.             } else {
  68.                 r = current_val;
  69.             }
  70.         }
  71.         std::cout << (l * 2) + 1 << " ";
  72.     }
  73.     return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement