Submission #479260

#TimeUsernameProblemLanguageResultExecution timeMemory
479260RainbowbunnyPalindromic Partitions (CEOI17_palindromic)C++17
100 / 100
138 ms13160 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e6 + 5; const int mod = 998244353; const int P = 1823; int Add(int x, int y, int m = mod) { return x + y >= m ? x + y - m : x + y; } int Sub(int x, int y, int m = mod) { return x - y < 0 ? x - y + m : x - y; } int Mul(int x, int y, int m = mod) { return 1ll * x * y % m; } int BinPow(int n, int k, int m = mod) { int ans = 1, cur = n; while(k) { if(k & 1) { ans = Mul(ans, cur); } cur = Mul(cur, cur); k >>= 1; } return ans; } int t; int pref[MAXN], pw[MAXN], ipw[MAXN]; string s; int Get(int l, int r) { return Mul(ipw[l], Sub(pref[r], l == 0 ? 0 : pref[l - 1])); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); pw[0] = 1; ipw[0] = 1; int tmp = BinPow(P, mod - 2); for(int i = 1; i < MAXN; i++) { pw[i] = Mul(pw[i - 1], P); ipw[i] = Mul(ipw[i - 1], tmp); } cin >> t; while(t--) { int ans = 0; cin >> s; for(int i = 0; i < (int)s.size(); i++) { pref[i] = (i == 0 ? 0 : pref[i - 1]); pref[i] = Add(pref[i], Mul(pw[i], s[i] - 'a' + 1)); } int l = 0, r = s.size() - 1; while(l <= r) { int tmpl = l; int tmpr = r; while(Get(l, tmpl) != Get(tmpr, r)) { tmpl++; tmpr--; } if(Get(l, tmpl) == Get(tmpr, r)) { if(tmpl < tmpr) { ans += 2; } else { ans++; } tmpl++; tmpr--; } l = tmpl; r = tmpr; } cout << ans << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...