제출 #1303064

#제출 시각아이디문제언어결과실행 시간메모리
1303064chinhhoangPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
209 ms34528 KiB
#include <bits/stdc++.h>
#define int long long
#define FOR(i,a,b) for (long long i = (a), _b = (b); i <= _b; i++)
#define FORD(i,b,a) for (long long i = (b), _a = (a); i>= _a; i--)
#define REP(i,n) for( long long i = 0, _n = (n); i < _n; i++)
#define all(v) (v).begin(),(v).end()
#define fi first
#define se second
#define MASK(i) (1<<(i))
#define BIT(x,i) ((x) >> (i) & 1)
using namespace std;

template<class X, class Y>
    bool minimize(X &x, const Y &y) {
        if (x > y) {
            x = y;
            return true;
        } else return false;
    }
template<class X, class Y>
    bool maximize(X &x, const Y &y) {
        if (x < y) {
            x = y;
            return true;
        } else return false;
}
const int N = 1e6+5;
const int base = 256;
int mod[2] = {(int)1e9+7,(int)998244353};
int pw[2][N], HASH[2][N];
unsigned getHash(int l,int r){
	int u = (HASH[0][r] - HASH[0][l-1] * pw[0][r-l+1] + mod[0] * mod[0]) % mod[0];
	int v = (HASH[1][r] - HASH[1][l-1] * pw[1][r-l+1] + mod[1] * mod[1]) % mod[1];
	//cout << u << ' ' << v << '\n';
	return (u << 30ll) | v;
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    int t;
    cin >> t;
    pw[0][0] = 1; pw[1][0] = 1;
    FOR(i,1,N-1) pw[0][i] = pw[0][i-1] * base % mod[0], pw[1][i] = pw[1][i-1] * base % mod[1];
    while(t--){
    	string s;
    	cin >> s;
    	int n = s.size();
    	if(n <= 15){
    		int ans = 0;
	    	REP(mask, MASK(n)){
	    		string t="";
	    		vector<string> ok;
	    		REP(i,n) {
	    			t += s[i];
	    			if(BIT(mask,i)){
	    				ok.push_back(t);
	    				t = "";
					}
				}
				if(t.size()) ok.push_back(t);
				int m = ok.size();
				bool palin = true;
				int i = 0, j = m - 1;
				while(i <= j){
					if(ok[i] != ok[j]) palin = false;
					i++;j--; 
				}
				if(palin) {
					maximize(ans,m);
				}
			}
			cout << ans << '\n';
			continue;
		}
    	s = " " + s;
    	FOR(i,1,n) HASH[0][i] = (HASH[0][i-1] * base + s[i]) % mod[0];
		FOR(i,1,n) HASH[1][i] = (HASH[1][i-1] * base + s[i]) % mod[1]; 
    	int i = 1, j = n;
    	int ans = 0;
    	while(i < j){
    		int u = i, v = j;
    		while(getHash(i,u) != getHash(v,j) && u < n && v > 1) u++, v--;
    		if(i != v && u != j) ans += 2; else ans++;
    		i = u+1, j = v-1;
    		if(i == j) {
    			ans ++;
    			break;
			}
		}
		cout << ans << '\n';
	}
    cerr << "\nTime elapsed: " << clock() * 1.000 / CLOCKS_PER_SEC << " ms.\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...