Submission #1165541

#TimeUsernameProblemLanguageResultExecution timeMemory
1165541hassanfathi2002Palindromic Partitions (CEOI17_palindromic)C++20
100 / 100
838 ms73740 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int mod = 1e9 + 7;

struct Hash{
    vector<int> p = {31 , 43 , 47};
    int n , m = p.size();
    vector<vector<ll>> pw, inv, pre;
    vector<ll> ip;

    Hash(const string &s){
        n = s.size();
        pw.resize(m);
        inv.resize(m);
        pre.resize(m);
        ip.resize(m);

        for(auto &a : pw)
            a.resize(n + 1);
        for(auto &a : pre)
            a.resize(n + 1);
        for(auto &a : inv)
            a.resize(n + 1);

        for(int i = 0; i < m; i ++){
            pw[i][0] = inv[i][0] = 1;
            ip[i] = mod_inv(p[i]);
        }
        for(int i = 0; i < m; i ++){
            for (int j = 1; j <= n; j ++){
                pw[i][j] = pw[i][j - 1] * p[i] % mod;
                inv[i][j] = inv[i][j - 1] * ip[i] % mod;
            }
        }
        int n = s.size();
        for(int i = 0; i < m; i ++){
            for (int j = 1; j <= n; j ++){
                pre[i][j] = (pre[i][j - 1] + (ll) (s[j - 1] - 'a' + 1) * pw[i][j]) % mod;
            }
        }
    }

    ll power(ll a , ll b){
        a %= mod;
        ll ret = 1;
        while(b){
            if(b & 1) 
                ret = (ret * a) % mod;
            a = (a * a) % mod;
            b >>= 1;
        }
        return ret;
    } 

    ll mod_inv(ll a){ // power(a , tot[b] - 1)
        return power(a , mod - 2);
    }

    vector<int> get(int l , int r){ // 0 based
        l ++ , r ++;
        vector<int> ret(m);
        for(int i = 0; i < m; i ++){
            ret[i] = (pre[i][r] - pre[i][l - 1] + mod) * inv[i][l] % mod;
        }
        return ret;
    }
};

void hassan(){
    string s;
    cin >> s;
    int n = s.size();
    Hash H(s);

    int res = 0;
    int l = 0;
    for(int r = 0; r < n / 2; r ++){
        // cout << l + 1 << " " << r + 1 << " " << n - r << " " << n - l << '\n';        
        if(H.get(l , r) == H.get(n - 1 - r, n - 1 - l)){
            l = r + 1;
            res += 2;
        }
        // cout << l + 1 << " " << r + 1 << " " << res << '\n';
    }
    res += (l != n / 2) || (n & 1);
    cout << res << '\n';
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int t; cin >> t; while(t --)
    hassan();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...