Advertisement
mfgnik

Untitled

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