제출 #1304362

#제출 시각아이디문제언어결과실행 시간메모리
1304362hungdtPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
114 ms35416 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e6 + 5;
const long long mod = 1e9 + 7;
const long long mod1 = 1e9 + 22071997;
const int base = 31, base1 = 37;
long long h[maxn], h1[maxn];
long long p[maxn], p1[maxn];
string s;
int n;

long long binpow(long long a, long long b, long long m){
    if (a == 0) return 0;
    if (b == 0) return 1;
    if (b == 1) return a;

    long long res = binpow(a, b / 2, m);
    if (b % 2 == 0) return res * res % m;
    return res * res % m * a % m;
}

void build(){
    for (int i=1; i<=n; i++){
        h[i] = h[i - 1] * base + (s[i] - 'a' + 1);
        h1[i] = h1[i - 1] * base1 + (s[i] - 'a' + 1);
        h[i] %= mod;
        h1[i] %= mod1;
    }
}

long long gethash(int l, int r, long long *a, long long *power, long long m){
    return (a[r] - (a[l - 1] * power[r - l + 1] % m) + m * m) % m;
}

bool check(int l, int r, int l1, int r1){
    return (gethash(l, r, h, p, mod) == gethash(l1, r1, h, p, mod)
        && gethash(l, r, h1, p1, mod1) == gethash(l1, r1, h1, p1, mod1));
}

void buildp(){
    p[0] = p1[0] = 1;
    p[1] = base;
    p1[1] = base1;

    for (int i=2; i<=1000000; i++){
        p[i] = p[i - 1] * base;
        p1[i] = p1[i - 1] * base1;
        p[i] %= mod;
        p1[i] %= mod1;
    }
}

int main()
{
    ios_base :: sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    buildp();

    int t;
    cin >> t;
    while (t--){
        cin >> s;
        n = s.size();
        s = " " + s;
        build();
        int l = 1, r = n, lastl = 1, lastr = n;
        int dem = 0;
        while (l < r){
            if (check(lastl, l, r, lastr)){
                dem += 2;
                lastl = l + 1;
                lastr = r - 1;
            }
            l++;
            r--;
        }

        if (lastl <= lastr) dem++;
        cout << dem << '\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...