제출 #1176379

#제출 시각아이디문제언어결과실행 시간메모리
1176379alterioPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
202 ms26704 KiB
#include <bits/stdc++.h> using namespace std; #define endl '\n' #define ll long long #define all(x) (x).begin(), (x).end() const int mxn = 1e6 + 10, MOD = 1e9 + 7; ll expo(ll base, ll pwr) { ll ans = 1; while (pwr) { if (pwr & 1) ans = (ans * base) % MOD; base = (base * base) % MOD; pwr /= 2; } return ans; } ll prf[mxn], pwr[mxn], inv[mxn]; ll get(int l, int r) { ll val = (prf[r] - prf[l - 1] + MOD) % MOD; val = (val * inv[l]) % MOD; return val; } bool same(int l1, int r1, int l2, int r2) { ll p1 = get(l1, r1), p2 = get(l2, r2); return p1 == p2; } void solve() { string s; cin >> s; s = "." + s; int n = s.size(); memset(prf, 0, sizeof(prf)); for (int i = 1; i < n; i++) prf[i] = (prf[i - 1] + (s[i] - 'a') * pwr[i]) % MOD; int last = 1, ans = 0; for (int i = 1; i < n; i++) { int len = i - last; int pos = n - i; if (last > pos) break; if (same(last, i, pos, pos + len)) { ans += 1 + (last != pos); last = i + 1; } } cout << ans << endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); pwr[0] = 1; for (int i = 1; i < mxn; i++) pwr[i] = (pwr[i - 1] * 26) % MOD; for (int i = 0; i < mxn; i++) inv[i] = expo(pwr[i], MOD - 2); 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...