Flickyyy

B-A'6

Aug 30th, 2022
630
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define all(a) a.begin(), a.end()
  4. #define forn(i, a, b, delta) for (ll i = a; i < b; i += delta)
  5. #define FAST ios_base::sync_with_stdio(false); cin.tie(nullptr)
  6. #pragma warning(disable : 4996)
  7. using ll = long long;
  8. const ll k1 = 41, mod1 = (int)1e9 + 7;
  9. const ll k2 = 31, mod2 = (int)1e9 + 7;
  10. vector<ll> pow1, pow2;
  11. bool pow_calc = false;
  12.  
  13. auto produce_hash(string s) {
  14.     const ll n = s.length();
  15.     if (!pow_calc) {
  16.         pow1.resize(1e6 + 1);
  17.         pow2.resize(1e6 + 1);
  18.         pow1[1] = 1;
  19.         pow2[1] = 1;
  20.         forn(i, 2, 1e6 + 1, 1) {
  21.             pow1[i] = (pow1[i - 1] * k1) % mod1;
  22.             pow2[i] = (pow2[i - 1] * k2) % mod2;
  23.         }
  24.         pow_calc = true;
  25.     }
  26.     vector<ll> hash1(n + 1);
  27.     vector<ll> hash2(n + 1);
  28.     hash1[1] = s[0];
  29.     hash2[1] = s[0];
  30.     forn(i, 2, n + 1, 1) {
  31.         hash2[i] = (s[i - 1] * pow2[i] + hash2[i - 1]) % mod2;
  32.         hash1[i] = (s[i - 1] * pow1[i] + hash1[i - 1]) % mod1;
  33.     }
  34.     return pair{hash1, hash2};
  35. }
  36.  
  37. auto get_hash(const vector<ll>& hash1, const vector<ll>& hash2, ll left, ll right) {
  38.     //[left; righ] hash 'moved' to the rigth
  39.     //left and right in [1,2,3,4,..., s.length()]
  40.     ll res1 = (hash1[right] - hash1[left - 1] + mod1) % mod1;
  41.     ll res2 = (hash2[right] - hash2[left - 1] + mod2) % mod2;
  42.     res1 = (res1 * pow1[hash1.size() - right]) % mod1;
  43.     res2 = (res2 * pow2[hash2.size() - right]) % mod2;
  44.     return pair {res1, res2};
  45. }
  46.  
  47. string prefix(string str) {
  48.     auto[left_h1, left_h2] = produce_hash(str);
  49.     reverse(all(str));
  50.     auto[right_h1, right_h2] = produce_hash(str);
  51.     reverse(all(str));
  52.     ll ans = 0;
  53.     forn(i, 0, str.length(), 1) {
  54.         //is [0; i] <=> [i; 0]
  55.         auto left = get_hash(left_h1, left_h2, 1, i + 1);
  56.         auto right = get_hash(right_h1, right_h2, str.length() - i, str.length());
  57.         if (left == right) {
  58.             ans = i + 1;
  59.         }
  60.     }
  61.     return string(str.begin(), str.begin() + ans);
  62. }
  63.  
  64. string mid(string str) {
  65.     if (str[0] != str.back()) return "";
  66.     ll bothlen = 1;
  67.     while (bothlen * 2 < str.length()) {
  68.         if (str[bothlen] != str[str.length() - 1 - bothlen]) break;
  69.         bothlen += 1;
  70.     }
  71.     if (bothlen * 2 >= str.length()) return "";
  72.     string pref(str.begin() + bothlen, str.end() - bothlen);
  73.     auto post = string(pref.rbegin(), pref.rend());
  74.     pref = prefix(pref);
  75.     post = prefix(post);
  76.     reverse(all(post));
  77.     string s11 = string(str.begin(), str.begin() + bothlen) + pref, s12(str.end() - bothlen, str.end()),
  78.             s21(str.begin(), str.begin() + bothlen), s22 = post + string(str.end() - bothlen, str.end());
  79.     string res1 = s11 + s12, res2 = s21 + s22;
  80.     return res1.length() > res2.length() ? res1 : res2;
  81. }
  82.  
  83. void solve() {
  84.     string str; cin >> str;
  85.     string rstr = str; reverse(all(rstr));
  86.     string ans1, ans2, ans3;
  87.     ans1 = mid(str);
  88.     ans2 = prefix(str);
  89.     ans3 = prefix(rstr);
  90.     vector<string> answers = { ans1, ans2, ans3 };
  91.     string ans = *max_element(all(answers), [](const string& a, const string& b) { return a.length() < b.length(); });
  92.     //cerr << "Answer:       ";
  93.     cout << ans << '\n';
  94. }
  95.  
  96.  
  97. int main() {
  98.     FAST;
  99.     //freopen("output.txt", "w", stdout);
  100.     //freopen("input.txt", "r", stdin);
  101.     int t; cin >> t;
  102.     while (t--) {
  103.         solve();
  104.     }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment