Submission #1166404

#TimeUsernameProblemLanguageResultExecution timeMemory
1166404VMaksimoski008Palindromic Partitions (CEOI17_palindromic)C++20
100 / 100
203 ms19976 KiB
#include <bits/stdc++.h> #define ar array //#define int long long using namespace std; using ll = long long; using pii = pair<int, int>; using pll = pair<ll, ll>; const int mod = 1e9 + 7; const ll inf = 1e18; const int maxn = 1e5 + 5; struct H { int n; string s; const ll p = 31; vector<ll> pw, hash; H(string _s) : s(_s) { n = s.size() - 1; pw.resize(n+1); hash.resize(n+1); pw[0] = 1; for(int i=1; i<=n; i++) pw[i] = (pw[i-1] * p) % mod; for(int i=1; i<=n; i++) hash[i] = (hash[i-1] + pw[i] * (s[i] - 'a')) % mod; } ll get_hash(int l, int r) { return (hash[r] - hash[l-1] + mod) % mod; } bool same(int l1, int r1, int l2, int r2) { if(r2 - l2 != r1 - l1) return 0; return (get_hash(l1, r1) * pw[l2-l1]) % mod == get_hash(l2, r2); } }; signed main() { ios_base::sync_with_stdio(false); cout.tie(0); cin.tie(0); int q; cin >> q; while(q--) { string s; cin >> s; int n = s.size(), ans = 0; s = "." + s; H hash(s); int l=1, r=n; while(l < r) { bool ok = 0; int l2=l, r2=r; while(l2 < r2) { if(hash.same(l, l2, r2, r)) { ok = 1; ans += 2; break; } l2++; r2--; } if(ok) { l = l2 + 1; r = r2 - 1; } else { ans++; break; } } cout << ans + (l == r) << '\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...