제출 #1150292

#제출 시각아이디문제언어결과실행 시간메모리
1150292dostsPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
1006 ms12008 KiB
#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimize("O3,unroll-loops")
using namespace std;
#define int long long
#define pii pair<int,int>
#define ff first
#define ss second
#define sp << " " <<    
#define all(cont) cont.begin(),cont.end()
#define vi vector<int>

const int inf = 1e17,N = 2e6+1,MOD = (1LL<<61)-1,B = 23;

int add(int x,int y) {
    return ((x+y >= MOD)?(x+y-MOD):(x+y));
}

int mult(__int128_t x,__int128_t y) {
    return (x*y)%MOD;
}

int expo(int x,int y) {
    if (!y) return 1;
    int e = expo(x,y/2);
    e = mult(e,e);
    if (y&1) e = mult(e,x);
    return e;
}

struct Hash{
    vi roll;
    int n;
    Hash(string& s) {
        n = s.size();
        roll.resize(n+1);
        for (int i=1;i<=n;i++) {
            roll[i] = add(s[i-1],mult(B,roll[i-1]));
        }
    }

    int get(int l,int r) {
        if (l == 1) return roll[r];
        return add(roll[r],MOD-mult(expo(B,r-l+1),roll[l-1]));
    }
};
void solve() { 
    string s;
    cin >> s;
    int n = s.size();
    int ptr = 1,ptr2 = n;
    int ans = 0;
    Hash h(s);
    bool finito = 0;
    while (1) {
        bool found = 0;
        int p = ptr,p2 = ptr2;
        for (;ptr < ptr2;ptr++,ptr2--) {
            if (h.get(ptr2,p2) == h.get(p,ptr)) {
                ans+=2;
                if (ptr == ptr2-1) finito = 1;
                ptr++,ptr2--;
                found = 1;
                break;
            }
        }
        if (!found) break;
    }
    if (!finito) ans++;
    cout << ans << '\n';
}

int32_t main() { 
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #ifdef Dodi 
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    cin >> t;
    while (t --> 0) 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...