Cod sursa(job #3233195)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 2 iunie 2024 19:02:12
Problema Elimin 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <bits/stdc++.h>
using namespace std;

string s;
const int nmax = 2005;
int16_t memo[nmax][nmax];

int solve(int left, int right)
{
	if(left > right)
		return 0;
	if(left == right)
		return 1;
	if(memo[left][right] != -1)
		return memo[left][right];
	if(s[left] == s[right])
		return memo[left][right] = 2 + solve(left + 1, right - 1);
	return memo[left][right] = max(solve(left + 1, right), solve(left, right - 1));
}


int main() {
	freopen("elimin2.in", "r", stdin);
	freopen("elimin2.out", "w", stdout);
	cin >> s;
	if(s.size() == 1)
	{
		cout << s << "\n";
		return 0;
	}
	memset(memo, -1, sizeof(memo));
	deque<int> p[10];
	for(size_t i = 0;i < s.size();++i)
		p[s[i] - '0'].push_back(i);
	int len = 0;
	for(int i = 1;i <= 9;++i)
	{
		if(!p[i].empty())
		{
			int l = p[i].front(), r = p[i].back();
			if(l != r)
				len = max(len, 2 + solve(l + 1, r - 1));
			else
				len = max(len, 1);
		}
	}
	
	string ans, sol;
	int left = -1, right = -1;
	bool od = false;
	
	while(len)
	{
		int end = 0;
		if(left == -1)
			end = 1;
		for(int i = 9;i >= end;--i)
		{
			if(!p[i].empty())
			{
				if(p[i].size() == 1 && len == 1)
				{
					sol = ans;
					sol += i + '0';
					reverse(ans.begin(), ans.end());
					sol += ans;
					--len;
					od = true;
					break;
				}
				else if(p[i].size() >= 2)
				{
					int l = p[i].front(), r = p[i].back();
					if(len == 2 + solve(l + 1, r - 1))
					{
						ans += i + '0';
						len -= 2;
						left = l + 1, right = r - 1;
						break;
					}
				}
			}
		}
		for(int i = 0;i <= 9;++i)
		{
			while(!p[i].empty() && p[i].front() < left)
				p[i].pop_front();
		}
		for(int i = 0;i <= 9;++i)
		{
			while(!p[i].empty() && p[i].back() > right)
				p[i].pop_back();
		}
	}
	if(!od)
	{
		sol += ans;
		reverse(ans.begin(), ans.end());
		sol += ans;
	}
	cout << sol << "\n";
}