제출 #1304362

#제출 시각아이디문제언어결과실행 시간메모리
1304362hungdtPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
114 ms35416 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6 + 5; const long long mod = 1e9 + 7; const long long mod1 = 1e9 + 22071997; const int base = 31, base1 = 37; long long h[maxn], h1[maxn]; long long p[maxn], p1[maxn]; string s; int n; long long binpow(long long a, long long b, long long m){ if (a == 0) return 0; if (b == 0) return 1; if (b == 1) return a; long long res = binpow(a, b / 2, m); if (b % 2 == 0) return res * res % m; return res * res % m * a % m; } void build(){ for (int i=1; i<=n; i++){ h[i] = h[i - 1] * base + (s[i] - 'a' + 1); h1[i] = h1[i - 1] * base1 + (s[i] - 'a' + 1); h[i] %= mod; h1[i] %= mod1; } } long long gethash(int l, int r, long long *a, long long *power, long long m){ return (a[r] - (a[l - 1] * power[r - l + 1] % m) + m * m) % m; } bool check(int l, int r, int l1, int r1){ return (gethash(l, r, h, p, mod) == gethash(l1, r1, h, p, mod) && gethash(l, r, h1, p1, mod1) == gethash(l1, r1, h1, p1, mod1)); } void buildp(){ p[0] = p1[0] = 1; p[1] = base; p1[1] = base1; for (int i=2; i<=1000000; i++){ p[i] = p[i - 1] * base; p1[i] = p1[i - 1] * base1; p[i] %= mod; p1[i] %= mod1; } } int main() { ios_base :: sync_with_stdio(false); cin.tie(0); cout.tie(0); buildp(); int t; cin >> t; while (t--){ cin >> s; n = s.size(); s = " " + s; build(); int l = 1, r = n, lastl = 1, lastr = n; int dem = 0; while (l < r){ if (check(lastl, l, r, lastr)){ dem += 2; lastl = l + 1; lastr = r - 1; } l++; r--; } if (lastl <= lastr) dem++; cout << dem << '\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...