제출 #1142552

#제출 시각아이디문제언어결과실행 시간메모리
1142552liangjeremyPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
100 ms19792 KiB
#include<bits/stdc++.h>
#include <iomanip>
#include<random>
using namespace std;
using db=double;
using ll=long long;
using sll=__int128;//super long long
using lb=long double;//lb is slow
//numbers for hashing: b(19260817),mod(998244353)
// freopen("fencedin.in", "r", stdin);
// freopen("fencedin.out", "w", stdout);

class HashString{
    private:
        vector<ll>phash;
        static vector<ll>pow;
        static const ll B=19260817;
        static const ll M=998244353;
    public:
        HashString(const string&s):phash(s.size()+1){
            while(pow.size()<=s.size()){
                pow.push_back(pow.back()*B%M);
            }
            phash[0]=0;
            for(int i=0; i<s.size(); i++){
                phash[i+1]=(phash[i]*B+s[i])%M;
            }
        }
        ll gethash(int end, int start){
            ll val=(phash[end+1]-phash[start]*pow[end-start+1])%M;
            return (val+M)%M;
        }
}; vector<ll>HashString::pow={1};

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    ll t; cin>>t;
    while(t--){
        string s; cin>>s; HashString hs(s); 
        ll ans=0; ll left=0; ll right=s.size()-1; ll start=0; ll end=s.size()-1;
        while(left<right){
            if(hs.gethash(left,start)==hs.gethash(end,right)){
                ans+=2; start=left+1; end=right-1;
            }
            left++; right--;
        }
        if(start<=end)ans++;
        cout<<ans;
        if(t)cout<<'\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...