Submission #1117015

#TimeUsernameProblemLanguageResultExecution timeMemory
1117015ortsacPalindromic Partitions (CEOI17_palindromic)C++17
100 / 100
2196 ms28824 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int MOD = 1e9 + 7; int mult(int a, int b) { return ((a * b) % MOD); } int sum(int a, int b) { return ((a + b) % MOD); } int binpow(int a, int b) { if (b == 0) return 1; int c = binpow(a, b/2); if ((b % 2LL) == 1LL) return mult(mult(c, c), a); else return mult(c, c); } struct Hash { vector<int> hashS, modInv; void build(string s) { int n = s.size(); hashS.resize(n + 1); modInv.resize(n + 1); hashS[0] = 0; modInv[0] = 1; int currM = 1; for (int i = 1; i <= n; i++) { currM = mult(currM, 31); modInv[i] = binpow(currM, MOD - 2); hashS[i] = sum(hashS[i - 1], mult(((int)(s[i - 1] - 'a')), currM)); } } int calc(int i, int j) { return sum(MOD, mult(hashS[j] - hashS[i - 1], modInv[i])); } }; int n; Hash hs; bool eq(int i, int j) { return (hs.calc(i, j) == hs.calc(n - j + 1, n - i + 1)); } void solve() { string s; cin >> s; hs.build(s); n = s.size(); int qtd = 0; int lst = 0; for (int i = 1; i <= (n / 2); i++) { if (eq(lst + 1, i)) { qtd += 2; lst = i; } } if (lst != ((n + 1)/2)) { qtd++; } cout << qtd << "\n"; } int32_t main() { int t; 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...