제출 #1163911

#제출 시각아이디문제언어결과실행 시간메모리
1163911canhnam357Palindromic Partitions (CEOI17_palindromic)C++20
100 / 100
528 ms50340 KiB
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define int long long
#define MASK(i) (1LL << (i))
void ckmax(int& f, int s)
{
	f = (f > s ? f : s);
}
void ckmin(int& f, int s)
{
	f = (f < s ? f : s);
}
const int mod1 = 1035972859;
const int mod2 = 1704760909;
const int mod3 = 2137321811;
const int mod4 = 2002577573;
const int mod5 = 2143922441;
const int base = 256;
struct hashing
{
	int mod;
	vector<int> h, p, inv;
	hashing() {}
	hashing(int mod, string s)
	{
		int n = s.length();
		this->mod = mod;
		h.resize(n);
		p.resize(n);
		inv.resize(n);
		h[0] = s[0];
		p[0] = 1;
		for (int i = 1; i < n; i++)
		{
			p[i] = (p[i - 1] * base) % mod;
			h[i] = (h[i - 1] + s[i] * p[i]) % mod;
		}
		inv[n - 1] = power(p[n - 1], mod - 2);
		for (int i = n - 2; i >= 0; i--) inv[i] = (inv[i + 1] * base) % mod;
	}
	int power(int a, int b)
	{
		int ans = 1;
		while (b)
		{
			if (b & 1) ans = (ans * a) % mod;
			(a *= a) %= mod;
			b >>= 1;
		}
		return ans;
	}
	int get(int l, int r)
	{
		if (l > r) return 0;
		return l ? ((h[r] - h[l - 1] + mod) * inv[l]) % mod : h[r];
	}
	bool same(int l1, int r1, int l2, int r2)
	{
		return get(l1, r1) == get(l2, r2);
	}
};
void solve()
{
	string s;
	cin >> s;
	hashing h1(mod1, s), h2(mod2, s);
	int l = 0, r = s.size() - 1;
	int ans = 0;
	while (l <= r)
	{
		if (l == r)
		{
			ans++;
			break;
		}
		int has = 0;
		for (int i = l; r - (i - l) > i; i++)
		{
			if (h1.same(l, i, r - (i - l), r) && h1.same(l, i, r - (i - l), r)) 
			{
				r -= i - l + 1;
				l = i + 1;
				ans += 2;
				has = 1;
				break;
			}
		}
		if (!has)
		{
			ans++;
			break;
		}
	}
	cout << ans << '\n';
}
int32_t main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int t;
	cin >> t;
	while (t--) solve();
	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...