제출 #1358209

#제출 시각아이디문제언어결과실행 시간메모리
1358209goulthenPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
919 ms18872 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define rep(i,a,b) for (int i = a; i <= b; i++)
#define per(i,a,b) for (int i = a; i >= b; i--)
#define pii pair<int,int>
#define fi first
#define se second

const int MAXN = 1e6+10;
const int INF = 1e9+67;
const int MOD = 1e9+7;
int pfx[MAXN], p[MAXN];

int fexp(int x, int y) {
    int ans = 1;
    while (y>0) {
        if (y&1) ans = x*ans%MOD;
        y>>=1;
        x = x*x%MOD; 
    }
    return ans;
}

int sum(int l, int r) {
    int x = pfx[r];
    if(l>0) x = (x-pfx[l-1]+MOD)%MOD;
    return x*fexp(p[l],MOD-2)%MOD;
}

void solve() {
    string s; cin >> s;
    int n = s.size();
    p[0] = 1;
    rep(i,0,n-1) {
        if(i>0) p[i] = 53*p[i-1]%MOD;
        pfx[i] = (s[i]-'a'+1)*p[i]%MOD;
        if(i>0) pfx[i] = (pfx[i]+pfx[i-1])%MOD;
    }

    int ans = 0;
    int ls = 0;
    rep(r,0,n/2-1) {
        if(sum(ls,r) != sum(n-r-1,n-ls-1)) continue;
        ls = r+1;
        ans += 2;
    }

    if(ls <= n/2-1 || n%2==1) ans++;
    cout << ans << endl;
}

int32_t main() {
    ios_base::sync_with_stdio(0);cin.tie(nullptr);
    int tt; cin >> tt;

    while (tt--) solve();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…