제출 #1344405

#제출 시각아이디문제언어결과실행 시간메모리
1344405nghiaxtoneriPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
120 ms42404 KiB
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define MASK(n) (1LL << n)
#define PhTrNghia "Palindromic_Partitions"

using namespace std;

const int maxn = 2e6 + 5;
const int MOD = 1e9 + 2277;
const int base = 311;

int add(int a, int b){
    a += b;
    if (a >= MOD) a -= MOD;
    if (a < 0) a += MOD;
    return a;
}

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

int binpow(int a, int b){
    int res = 1;
    for (; b; b >>= 1, a = mul(a, a)) if (b & 1) res = mul(res, a);
    return res;
}

int hs1[maxn], pw[maxn], inv_pw[maxn];
int n;

int get_hash(int l, int r){
    return mul(add(hs1[r], -hs1[l-1]), inv_pw[l-1]);
}

void solve(){
    string s;
    cin >> s;
    n = s.size();
    s = ' ' + s;

    hs1[0] = 0;
    for (int i = 1; i <= n; i++) hs1[i] = add(hs1[i-1], mul(s[i] - 'a' + 1, pw[i-1]));

    int l = 1, r = n;
    int res = 0;

    while (l < r){
        int ok = 0;

        for (int len = 1; len <= (r - l + 1) >> 1; len++){
            if (get_hash(l, l + len - 1) == get_hash(r - len + 1, r)){
                res += 2;
                l = l + len;
                r = r - len;
                ok = 1;
                break;
            }
        }

        if (!ok) break;
    }

    if (l <= r) res++;

    cout << res << endl;
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    if (fopen(PhTrNghia".INP", "r")){
        freopen(PhTrNghia".INP", "r", stdin);
        freopen(PhTrNghia".OUT", "w", stdout);
    }

    int inv_base = binpow(base, MOD - 2);

    pw[0] = inv_pw[0] = 1;
    for (int i = 1; i < maxn; i++){
        pw[i] = mul(pw[i-1], base);
        inv_pw[i] = mul(inv_pw[i-1], inv_base);
    }

    int q;
    cin >> q;
    while (q--) solve();

    return 0;
}
/*
4
bonobo
deleted
racecar
racecars
*/

컴파일 시 표준 에러 (stderr) 메시지

palindromic.cpp: In function 'int main()':
palindromic.cpp:74:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   74 |         freopen(PhTrNghia".INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
palindromic.cpp:75:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |         freopen(PhTrNghia".OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...