Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <map>
- #include <algorithm>
- #include <string>
- #define int long long
- int add(int a, int b, int mod) {
- return (a + b) % mod;
- }
- int sub(int a, int b, int mod) {
- return ((a - b) % mod + mod) % mod;
- }
- int mull(int a, int b, int mod) {
- return (a * b) % mod;
- }
- 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) {
- 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));
- }
- int32_t main() {
- std::string b;
- std::cin >> b;
- int p = 10, m = 1000000000 + 21, m_2 = 998244353;
- 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);
- std::vector<std::pair<int, int>> hashes((int)b.size() + 1), rev_hashes((int)b.size() + 1);
- hashes[0].first = 0;
- powers[0] = 1;
- hashes[0].second = 0;
- powers_2[0] = 1;
- rev_powers[0] = 1;
- rev_powers_2[0] = 1;
- for (int i = 0; i < (int)b.size(); ++i) {
- hashes[i + 1].first = add(mull(hashes[i].first, p, m), b[i], m);
- powers[i + 1] = mull(powers[i], p, m);
- hashes[i + 1].second = add(mull(hashes[i].second, p, m_2), b[i], m_2);
- powers_2[i + 1] = mull(powers_2[i], p, m_2);
- }
- std::reverse(b.begin(), b.end());
- for (int i = 0; i < (int)b.size(); ++i) {
- rev_hashes[i + 1].first = add(mull(rev_hashes[i].first, p, m), b[i], m);
- rev_powers[i + 1] = mull(rev_powers[i], p, m);
- rev_hashes[i + 1].second = add(mull(rev_hashes[i].second, p, m_2), b[i], m_2);
- rev_powers_2[i + 1] = mull(rev_powers_2[i], p, m_2);
- }
- // for (auto x : hashes) std::cout << x.first << ' ';
- // std::cout << '\n';
- // for (auto x : rev_hashes) std::cout << x.first << ' ';
- // std::cout << '\n';
- for (int i = 0; i < (int)b.size(); ++i){
- int l = 0, r = std::min(i, static_cast<int>(b.size()) - i) + 1;
- // std::cout << l << " " << r << "\n";
- // std::cout << "i = " << i << "\n";
- while (r - l > 1){
- int current_val = (r + l + 1) / 2;
- //std::cout << l << " " << current_val << " " << r << "\n";
- int left_index = i - current_val, right_index = i - 1;
- int reversed_left_index = (int)b.size() - 1 - right_index, reversed_right_index = (int)b.size() - 1 - left_index;
- auto a_1 = GetHash(left_index, right_index, hashes, powers, powers_2, m, m_2);
- auto a_2 = GetHash(reversed_left_index, reversed_right_index, rev_hashes, rev_powers, rev_powers_2, m, m_2);
- // std::cout << left_index << " " << right_index << " " << reversed_left_index << " " << reversed_right_index << "\n";
- // std::cout << a_1.first << " " << a_1.second << " " << a_2.first << " " << a_2.second << "\n";
- if (a_1 == a_2) {
- l = current_val;
- }
- else {
- r = current_val;
- }
- }
- std::cout << (l * 2) + 1 << " ";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement