Submission #1303067

#TimeUsernameProblemLanguageResultExecution timeMemory
1303067skibidigodv9Palindromic Partitions (CEOI17_palindromic)C++20
100 / 100
176 ms77628 KiB
#include <bits/stdc++.h> using namespace std; long long P1 = 1000000007, P2 = 1000000009; pair<long long, long long> b = {1024, 2048}; void Add(pair<long long, long long>& a, pair<long long, long long> b) { a.first += b.first; if (a.first >= P1) a.first -= P1; a.second += b.second; if (a.second >= P2) a.second -= P2; return; } void Sub(pair<long long, long long>& a, pair<long long, long long> b) { a.first -= b.first; if (a.first < 0) a.first += P1; a.second -= b.second; if (a.second < 0) a.second += P2; return; } void Mul(pair<long long, long long>& a, pair<long long, long long> b) { a.first = (a.first*b.first)%P1; a.second = (a.second*b.second)%P2; return; } vector<pair<long long, long long>> bpw(1234567); void pc() { long long n = bpw.size(),i; bpw[0] = {1,1}; i = 0; while (++i < n) {bpw[i] = bpw[i-1]; Mul(bpw[i], b);} } vector<pair<long long, long long>> PH; void calcPH(vector<long long>& A) { long long n = A.size(), i, j; vector<pair<long long, long long>> ok(n); PH = ok; i = -1; while (++i < n) { pair<long long, long long> V = {A[i], A[i]}; Mul(V, bpw[i]); PH[i] = V; if (i) Add(PH[i], PH[i-1]); } } bool comp(long long l1, long long r1, long long l2, long long r2) { if ((r1-l1) != (r2-l2)) return false; if (l2 < l1) { swap(l1, l2); swap(r1, r2); } pair<long long, long long> v1 = PH[r1], v2 = PH[r2]; if (l1) Sub(v1, PH[l1-1]); if (l2) Sub(v2, PH[l2-1]); long long d = l2-l1; Mul(v1, bpw[d]); return v1 == v2; } int main() { //freopen("SIXCUP.inp","r",stdin); //freopen("SIXCUP.out","w",stdout); ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); pc(); int T; cin >> T; while (T--) { string s; cin >> s; long long n = s.size(), i, j; vector<long long> A(n); i = -1; while (++i < n) A[i] = s[i]; calcPH(A); if (n == 1) { cout << 1 << "\n"; continue; } //3 = 0 //4 = 1 long long ep = (n/2)-1; long long lst = -1; long long ans = 0; i = -1; while (i++ < ep) { long long l1 = lst+1, r1 = i; long long l2 = n-1-r1, r2 = n-1-l1; if (comp(l1, r1, l2, r2)) { ans += 2; lst = r1; } } if ((lst != ep) || (n%2)) ans++; cout << ans << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...