Submission #243284

#TimeUsernameProblemLanguageResultExecution timeMemory
243284LawlietPalindromic Partitions (CEOI17_palindromic)C++17
100 / 100
644 ms17840 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long int lli;

const int MAXN = 1000010;

int prime = 31;
int mod = 1000000009;

int n;

lli pot[MAXN];
lli pHash[MAXN];

string s;

int getHash(int L, int R)
{
	lli ans = pHash[R + 1];
	ans -= pHash[L]*pot[R - L + 1];

	ans %= mod;
	if( ans < 0 ) ans += mod;

	return (int)ans;
}

int main()
{
	int t;
	cin >> t;

	pot[0] = 1;

	for(int i = 1 ; i < MAXN ; i++)
		pot[i] = pot[i - 1]*prime, pot[i] %= mod;

	while( t-- )
	{
		cin >> s;
		n = (int)s.size();

		for(int i = 1 ; i <= n ; i++)
		{
			pHash[i] = pHash[i - 1]*prime + s[i - 1] - 'a';
			pHash[i] %= mod;
		}

		int sz = 1, ans = 0;
		int l = 0, r = n - 1;

		while( l <= r )
		{
			sz = 1;

			while( getHash( l , l + sz - 1 ) != getHash( r - sz + 1 , r ) )
				sz++;

			ans++;
			l += sz; r -= sz;

			if( l <= r + 1 ) ans++;
		}

		printf("%d\n",ans);
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...