Submission #1302446

#TimeUsernameProblemLanguageResultExecution timeMemory
1302446kawhietPalindromic Partitions (CEOI17_palindromic)C++20
0 / 100
1 ms332 KiB
#include <bits/stdc++.h>
using namespace std;

constexpr int p = 31;
constexpr int mod = 1e9 + 7;

void solve() {
    string a;
    cin >> a;
    int n = a.size();
    vector<int> h(n + 1), pw(n + 1, 1);
    for (int i = 0; i < n; i++) {
        pw[i + 1] = (pw[i] * p) % mod;
        h[i + 1] = (h[i] * p + (a[i] - 'a' + 1)) % mod;
    }
    auto get = [&](int l, int r) {
        return (h[r] - h[l - 1] * pw[r - l + 1] % mod + mod) % mod;
    };
    auto sub = [&](int l, int r) {
        string ret;
        l--; r--;
        for (int i = l; i <= r; i++) {
            ret += a[i];
        }
        return ret;
    };
    int tl = 1, tr = n, l = 1, r = n, ans = 0;
    string s;
    while (l < r) {
        s.push_back(a[l]);
        int pre = get(tl, l);
        int suf = get(r, tr);
        string left = sub(tl, l);
        string right = sub(r, tr);
        if (left == right) {
            assert(pre == suf);
        }
        if (pre == suf) {
            assert(left == right);
            // string left = a.substr(a.begin() + tl - 1, a.begin() + l);
            // string right = a.substr(a.begin() + r - 1, a.begin() + tr);
            tl = l + 1;
            tr = r - 1;
            s.clear();
            ans += 2;
        }
        l++; r--;
    }
    if (l <= r || !s.empty()) {
        ans++;
    }
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    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...