Submission #499857

#TimeUsernameProblemLanguageResultExecution timeMemory
499857pooyashamsPalindromic Partitions (CEOI17_palindromic)C++14
60 / 100
560 ms49396 KiB
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cstring>
#include <iomanip>
#include <vector>
#include <bitset>
#include <stack>
#include <queue>
#include <cmath>
#include <set>
#include <map>

using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

const int maxn = 5010;

short dp[maxn];
short mxl[maxn][maxn];
int n;
string s;

inline void fill_mxl()
{
	int mid = n/2;
	for(int i = mid-1; i >= 0; i--)
	{
		for(int j = n-1; j >= mid; j--)
		{
			mxl[i][j-mid] = 0;
			if(s[i] == s[j])
			{
				if(i == mid-1 or j == n-1)
					mxl[i][j-mid] = 1;
				else
					mxl[i][j-mid] = 1+mxl[i+1][j-mid+1];
			}
		}
	}
}

inline void fill_dp()
{
	int mid = n/2;
	if(n & 1)
		dp[mid] = 1;
	else
		dp[mid] = 0;
	for(int i = mid-1; i >= 0; i--)
	{
		dp[i] = 1;
		for(int j = i; j < mid; j++)
		{
			if(mxl[i][n-1-j-mid] >= j-i+1)
				dp[i] = max(dp[i], (short)(dp[j+1]+2) );
		}
	}
	//for(int i = 0; i < mid; i++)
	//	cerr << dp[i] << " ";
	//cerr << endl;
}

inline void solve()
{
	cin >> s;
	n = s.size();
	fill_mxl();
	fill_dp();
	cout << dp[0] << endl;
}

int32_t main()
{
	ios::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...