Submission #1311702

#TimeUsernameProblemLanguageResultExecution timeMemory
1311702metaliusPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
213 ms34532 KiB
#include "bits/stdc++.h"

using namespace std;

using ll = long long;

#define MAXN 1000003

mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count());

const unsigned long long HMOD1 = rng(); //llabs(rng());
const unsigned long long HMOD2 = rng();//llabs(rng());
const ll ppow = 31;

ll h1[MAXN];
ll h2[MAXN];
ll pows1[MAXN];
ll pows2[MAXN];


void precomp(string & s) {
	
	for(int i = 0; i < s.size(); i++) {
		if(i == 0) {
			h1[i] = (ll)(s[i] - 'a' + 1);
			h2[i] = h1[i];
		} else {
			h1[i] = h1[i-1]*ppow + (ll)(s[i] - 'a' + 1);
			h2[i] = h2[i-1]*ppow + (ll)(s[i] - 'a' + 1);
			h1[i] %= HMOD1;
			h2[i] %= HMOD2;
		}
	}
}

pair<ll,ll> hsh(int a, int b) {
	// s0 s1 s2 s3 s4
	// s2 s3 s4
	if(a == 0) return {h1[b],h2[b]};
	// s4 + s3 * p + s2 * p^2
	// h1[4] = s4 + s3*p + s2*p^2 + s1*p^3 +s0*p^4
	// h1[1] = s1 + s0*p
	// hsh(2,4) = h1[4] - h1[2-1]*p^(4-2+1)
	return {(h1[b] - ((pows1[b-a+1]*h1[a-1]) % HMOD1) + HMOD1) % HMOD1, (h2[b] - ((pows2[b-a+1]*h2[a-1]) % HMOD2) + HMOD2) % HMOD2};
}

bool eq(int a1, int b1, int a2, int b2) {
	auto hh1 = hsh(a1,b1);
	auto hh2 = hsh(a2,b2);
	return hh1.first == hh2.first && hh1.second == hh2.second;
}



ll qr(int a, int b,int mdind) {
	if(a > b) return 0;
	if(a == b) return 1;
	if(a == b-1) return eq(a,a,b,b)?2:1; 
	for(int i = a,j=b; i <= mdind; i++,j--) {
		if(eq(a,i,j,b)) return 2 + qr(i+1,j-1,mdind);
	} 
	return 1;
}


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	pows1[0] = 1;
	pows2[0] = 1;
	for(int i = 1; i <= (int)(1e6); i++) {
		pows1[i] = pows1[i-1]*ppow;
		pows2[i] = pows2[i-1]*ppow;
		pows1[i] %= HMOD1;
		pows2[i] %= HMOD2;
	}
	int t; cin >> t;
	while(t--) {
		string s; cin >> s;
		precomp(s);
		if(s.size() == 1) {
			cout << 1 << "\n";
			continue;
		}
		cout << qr(0,s.size() - 1,((int)s.size() - 1)/2) << "\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...