Submission #1291446

#TimeUsernameProblemLanguageResultExecution timeMemory
1291446cspercivalPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
217 ms19284 KiB
// Template generated by Clank
#include<bits/stdc++.h>
using namespace std;
#define st first
#define nd second
#define all(x) x.begin(), x.end()
#define BOOST cin.tie(NULL); ios_base::sync_with_stdio(false);
// #define int ll
typedef long long ll;
 
struct Hash{
    ll mod;
    ll p;
    int n;
    string s;
    vector<ll> h;
    vector<ll> pk;
    Hash(string &ins, ll inp, ll inmod) : p(inp), mod(inmod) {
        s = "#" + ins;
        n = s.size();
        h.resize(n);
        pk.resize(n);
        pk[0] = 1;
        for(int i = 1; i < n; i++){
            pk[i] = (pk[i - 1] * p) % mod;
            h[i] = (h[i - 1] * p + s[i] - 'a' + 1) % mod;
        }
    }

    ll seg(int l, int r){
        l++; r++;
        ll tmp = (h[r] - (h[l - 1] * pk[r - l + 1])) % mod;
        if(tmp < 0) tmp += mod;
        return tmp;
    }
};

void solve(){
    string s; cin >> s;
    int n = s.size();
    int last_good = 0;
    int ans = 0;
    Hash h1(s, 43, 888173173);
    for(int i = 0; i < n / 2; i++){
        if(h1.seg(last_good, i) == h1.seg(n - i - 1, n - last_good - 1)){
            ans += 2;
            last_good = i + 1;
        }
    }
    if(n&1 || last_good < n/2) ans++;

    cout << ans << "\n";
}

int32_t main(){
    BOOST;
    int q; cin >> q;
    while(q--)
        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...