Submission #1303067

#TimeUsernameProblemLanguageResultExecution timeMemory
1303067skibidigodv9Palindromic Partitions (CEOI17_palindromic)C++20
100 / 100
176 ms77628 KiB
#include <bits/stdc++.h>
using namespace std;

long long P1 = 1000000007, P2 = 1000000009;
pair<long long, long long> b = {1024, 2048};

void Add(pair<long long, long long>& a, pair<long long, long long> b) {
    a.first += b.first; if (a.first >= P1) a.first -= P1;
    a.second += b.second; if (a.second >= P2) a.second -= P2;
    return;
}

void Sub(pair<long long, long long>& a, pair<long long, long long> b) {
    a.first -= b.first; if (a.first < 0) a.first += P1;
    a.second -= b.second; if (a.second < 0) a.second += P2;
    return;
}

void Mul(pair<long long, long long>& a, pair<long long, long long> b) {
    a.first = (a.first*b.first)%P1;
    a.second = (a.second*b.second)%P2;
    return;
}

vector<pair<long long, long long>> bpw(1234567);

void pc() {
    long long n = bpw.size(),i;
    bpw[0] = {1,1};
    i = 0; while (++i < n) {bpw[i] = bpw[i-1]; Mul(bpw[i], b);}
}

vector<pair<long long, long long>> PH;

void calcPH(vector<long long>& A) {
    long long n = A.size(), i, j;
    vector<pair<long long, long long>> ok(n); PH = ok;
    i = -1; while (++i < n) {
        pair<long long, long long> V = {A[i], A[i]};
        Mul(V, bpw[i]);
        PH[i] = V;
        if (i) Add(PH[i], PH[i-1]);
    }
}

bool comp(long long l1, long long r1, long long l2, long long r2) {
    if ((r1-l1) != (r2-l2)) return false;
    if (l2 < l1) {
        swap(l1, l2); swap(r1, r2);
    }
    pair<long long, long long> v1 = PH[r1], v2 = PH[r2];
    if (l1) Sub(v1, PH[l1-1]);
    if (l2) Sub(v2, PH[l2-1]);
    long long d = l2-l1;
    Mul(v1, bpw[d]);
    return v1 == v2;
}

int main() {
    //freopen("SIXCUP.inp","r",stdin);
    //freopen("SIXCUP.out","w",stdout);
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    pc();
    int T; cin >> T;
    while (T--) {
        string s; cin >> s;
        long long n = s.size(), i, j;
        vector<long long> A(n); i = -1; while (++i < n) A[i] = s[i];
        calcPH(A);
        if (n == 1) {
            cout << 1 << "\n";
            continue;
        }
        
        //3 = 0
        //4 = 1
        long long ep = (n/2)-1;
        long long lst = -1;
        long long ans = 0;
        i = -1; while (i++ < ep) {
            long long l1 = lst+1, r1 = i;
            long long l2 = n-1-r1, r2 = n-1-l1;
            if (comp(l1, r1, l2, r2)) {
                ans += 2; lst = r1;
            }
        }
        if ((lst != ep) || (n%2)) ans++;
        cout << ans << "\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...