Raslboyy

1326v2

Nov 10th, 2019
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.07 KB | None | 0 0
  1. #include <iostream>
  2. //#include <chrono>
  3. //#include <fstream>
  4. //#include <bits/stdc++.h>
  5. #include <string>
  6. #include <vector>
  7. #include <algorithm>
  8.  
  9. #define mp make_pair
  10. #define pb push_back
  11. #define eb emplace_back
  12. #define f first
  13. #define s second
  14. #define sz(x) (int)x.size()
  15. #define all(x) begin(x), end(x)
  16. #define rall(x) rbegin(x), rend(x)
  17.  
  18. using namespace std;
  19.  
  20. typedef unsigned long long ull;
  21. typedef long long ll;
  22. typedef long double ld;
  23. typedef pair<int, int> pi;
  24. typedef pair<ll, ll> pl;
  25.  
  26. const ull MOD = 1e9 + 9;
  27. const int P = 31;
  28.  
  29. int main() {
  30.     /*ifstream cin("in.txt");
  31.     ofstream cout("out.txt");
  32.     auto start_time = chrono::high_resolution_clock::now();*/
  33.  
  34.     ios::sync_with_stdio(false);
  35.     cin.tie(0);
  36.     cout.tie(0);
  37.  
  38.    
  39.     string str;
  40.     cin >> str;
  41.     int len = str.size();
  42.     vector<int> pref(len);
  43.     vector<int> suff(len);
  44.     vector<int> pw(len);
  45.  
  46.     pw[0] = 1;
  47.     for (int i = 1; i < len; i++) pw[i] = (pw[i - 1] * (ll)P) % MOD;
  48.  
  49.     pref[0] = (str[0] - 'a' + 1) * pw[0];
  50.     for (int i = 1; i < len; i++)
  51.         pref[i] = (pref[i - 1] + ((str[i] - 'a' + 1) * (ll)pw[i]) % MOD) % MOD;
  52.  
  53.     suff[len-1] = (str[len-1] - 'a' + 1) * pw[0];
  54.     for (int i = len - 2; i >= 0; i--)
  55.         suff[i] = (suff[i + 1] + ((str[i] - 'a' + 1) * (ll)pw[len - i - 1]) % MOD) % MOD;
  56.    
  57.     vector<int> answ(len);
  58.     answ[0] = 0;
  59.     answ[len-1] = 0;
  60.     for (int i = 1; i < len - 1; i++) {
  61.         int l = 0, r = min(i - 0, len - i - 1) + 1;
  62.         while (l + 1 < r) {
  63.             int mid = (l + r) / 2;
  64.             ll a = (MOD + (ll)pref[i + mid] - (ll)pref[i - 1]) % MOD;
  65.             ll b = (MOD + (ll)suff[i - mid] - (ll)suff[i + 1]) % MOD;
  66.             if (i < len - i) {
  67.                 if (a * pw[abs(2 * i - len + 1)] % MOD == b)
  68.                     l = mid;
  69.                 else
  70.                     r = mid;
  71.             }
  72.             else {
  73.                 if (b * pw[abs(2 * i - len + 1)] % MOD == a)
  74.                     l = mid;
  75.                 else
  76.                     r = mid;
  77.             }
  78.         }
  79.         answ[i] = l;
  80.     }
  81.    
  82.     for (int i : answ)
  83.         cout << 1 + i * 2 << " ";
  84.  
  85.     /*auto end_time = chrono::high_resolution_clock::now();
  86.     chrono::duration<double> duration = end_time - start_time;
  87.     cout << duration.count() << "\n";
  88.     cin.close();
  89.     cout.close();*/
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment