Submission #927934

#TimeUsernameProblemLanguageResultExecution timeMemory
927934TAhmed33Palindromic Partitions (CEOI17_palindromic)C++98
100 / 100
355 ms66004 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MOD = 1e9 + 7;
const int base = 9973;
int add (int a, int b) {
	return (MOD + (a + b) % MOD) % MOD;
}
int sub (int a, int b) {
	return ((a - b) % MOD + MOD) % MOD;
}
int mul (int a, int b) {
	return (a * b) % MOD;
}
int n;
string s;
int pw[1000001];
int p_hash[1000001];
int dp[1000001];
inline int get (int l, int r) {
	return sub(p_hash[r + 1], mul(p_hash[l], pw[r - l + 1]));
}
int ans (int l, int r) {
	if (l == r) {
		return 1;
	}
	if (l > r) {
		return 0;
	}
	int &ret = dp[l];
	if (ret != -1) return ret;
	ret = 1;
	for (int i = l; i < n/2; i++) {
		int x = i - l + 1;
		if (get(l, i) == get(r - x + 1, r)) {
			ret = ans(i + 1, r - x) + 2	;
			break;
		}
	}
	return ret;
}
void solve () {
	cin >> s; n = s.length();
	for (int i = 1; i <= n; i++) {
		dp[i - 1] = -1;
		p_hash[i] = add(mul(p_hash[i - 1], base), s[i - 1]);
	}
	cout << ans(0, n - 1) << '\n';
}
signed main () {
	pw[0] = 1;
	for (int i = 1; i <= 1e6; i++) {
		pw[i] = mul(base, pw[i - 1]);
	}
	int t;
	cin >> t;
	while (t--) 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...