Submission #1282551

#TimeUsernameProblemLanguageResultExecution timeMemory
1282551Peti4Palindromic Partitions (CEOI17_palindromic)C++20
100 / 100
285 ms26772 KiB
#include <bits/stdc++.h> using namespace std; //#define int long long #define ll long long #define all(v) v.begin(), v.end() #define vi vector<int> #define el '\n' #define pii pair<int, int> const int N = 1e6 + 2; const int Hnum = 2; #define pt4 array<int, Hnum> pt4 mods, bases, pw[N]; bool is_prime(int n) { if (n <= 1) return 0; for (int i = 2; i * i <= n; i++) if (n % i == 0) return 0; return 1; } void pre() { random_device rd; mt19937 mt(rd()); auto rnd = [&] (int l, int r) {return uniform_int_distribution<int>(l, r)(mt);}; for (int i = 0; i < Hnum; i++) bases[i] = rnd(100, 500); for (int i = 0; i < Hnum; i++) { mods[i] = rnd(2e8, 2e9); while (!is_prime(mods[i])) --mods[i]; } for (int i = 0; i < Hnum; i++) pw[0][i] = 1; for (int i = 1; i < N; i++) for (int j = 0; j < Hnum; j++) pw[i][j] = pw[i-1][j] * 1ll * bases[j] % mods[j]; } struct Hash { vector<pt4> prefix, suffix; int n; Hash(string &s) { n = s.size(); init_prefix(s); init_suffix(s); } void init_prefix(string &s) { prefix.assign(n, {}); pt4 pr{}; for (int i = 0; i < n; i++) { for (int j = 0; j < Hnum; j++) { pr[j] = (pr[j] * 1ll * bases[j] + s[i]) % mods[j]; } prefix[i] = pr; } } void init_suffix(string &s) { suffix.assign(n, {}); pt4 pr{}; for (int i = n-1; i >= 0; i--) { for (int j = 0; j < Hnum; j++) { pr[j] = (pr[j] * 1ll * bases[j] + s[i]) % mods[j]; } suffix[i] = pr; } } pt4 get(int l, int r) { if (!l) return prefix[r]; pt4 ret = prefix[r]; for (int i = 0; i < Hnum; i++) { ret[i] -= (prefix[l-1][i] * 1ll * pw[r-l+1][i]) % mods[i]; if (ret[i] < 0) ret[i] += mods[i]; } return ret; } pt4 getr(int l, int r) { if (r == n-1) return suffix[l]; pt4 ret = suffix[l]; for (int i = 0; i < Hnum; i++) { ret[i] -= (suffix[r+1][i] * 1ll * pw[r-l+1][i]) % mods[i]; if (ret[i] < 0) ret[i] += mods[i]; } return ret; } }; void solve() { string s; cin >> s; Hash h(s); int n = s.size(), l = 0, r = n-1, ans = 0, tmp = 0; while (2*(l+tmp)+1 < n) { if (h.get(l, l+tmp) == h.get(r-tmp, r)) { ans += 2; l += tmp+1; r -= (tmp+1); tmp = 0; } else tmp++; } if (2*l != n) ans++; cout << ans << el; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); pre(); int t = 1; cin >> t; while (t--) {solve();} }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...