Submission #1117015

#TimeUsernameProblemLanguageResultExecution timeMemory
1117015ortsacPalindromic Partitions (CEOI17_palindromic)C++17
100 / 100
2196 ms28824 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int MOD = 1e9 + 7;

int mult(int a, int b) {
    return ((a * b) % MOD);
}

int sum(int a, int b) {
    return ((a + b) % MOD);
}

int binpow(int a, int b) {
    if (b == 0) return 1;
    int c = binpow(a, b/2);
    if ((b % 2LL) == 1LL) return mult(mult(c, c), a);
    else return mult(c, c);
}

struct Hash {
    vector<int> hashS, modInv;

    void build(string s) {
        int n = s.size();
        hashS.resize(n + 1);
        modInv.resize(n + 1);
        hashS[0] = 0;
        modInv[0] = 1;
        int currM = 1;
        for (int i = 1; i <= n; i++) {
            currM = mult(currM, 31);
            modInv[i] = binpow(currM, MOD - 2);
            hashS[i] = sum(hashS[i - 1], mult(((int)(s[i - 1] - 'a')), currM));
        }
    }

    int calc(int i, int j) {
        return sum(MOD, mult(hashS[j] - hashS[i - 1], modInv[i]));
    }
};

int n;
Hash hs;

bool eq(int i, int j) {
    return (hs.calc(i, j) == hs.calc(n - j + 1, n - i + 1));
}

void solve() {
    string s;
    cin >> s;
    hs.build(s);
    n = s.size();
    int qtd = 0;
    int lst = 0;
    for (int i = 1; i <= (n / 2); i++) {
        if (eq(lst + 1, i)) {
            qtd += 2;
            lst = i;
        }
    }
    if (lst != ((n + 1)/2)) {
        qtd++;
    }
    cout << qtd << "\n";
}

int32_t main() {
    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...