Cod sursa(job #3293024)

Utilizator EricRaiaEricRaia EricRaia Data 10 aprilie 2025 09:07:54
Problema Elimin 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("elimin2.in");
ofstream fout("elimin2.out");

const short alpha = 10;
const short DIM = 2007;

short st[DIM][alpha];
short dr[DIM][alpha];

short dp[DIM][DIM];

void print(short l, short r, short val)
{
	if(l > r)
		return ;

	for(short i = alpha - 1; i >= 0; i--)
		if(dp[dr[l][i]][st[r][i]] == val)
		{
			fout << i;

			print(dr[l][i] + 1, st[r][i] - 1, val - 2);

			if(val >= 2)
				fout << i;

			return ;
		}
}

main()
{
	string s;
	fin >> s;

	short n = s.size();

	s = ' ' + s;

	for(short i = 0; i < alpha; i++)
		dr[n + 1][i] = n + 1;

	for(short i = 1; i <= n; i++)
	{
		for(short j = 0; j < alpha; j++)
			st[i][j] = st[i - 1][j];

		st[i][s[i] - '0'] = i;
	}

	for(short i = n; i >= 1; i--)
	{
		for(short j = 0; j < alpha; j++)
			dr[i][j] = dr[i + 1][j];

		dr[i][s[i] - '0'] = i;
	}

	for(short i = 1; i <= n; i++)
		dp[i][i] = 1;

	for(short len = 2; len <= n; len++)
		for(short i = 1; i + len - 1 <= n; i++)
			if(s[i] == s[i + len - 1])
				dp[i][i + len - 1] = dp[i + 1][i + len - 2] + 2;
			else
				dp[i][i + len - 1] = max(dp[i + 1][i + len - 1], dp[i][i + len - 2]);

	short res = 0;

	for(short i = 1; i < alpha; i++)
		if(dr[1][i] != -1)
			res = max(res, dp[dr[1][i]][st[n][i]]);

	print(1, n, res);
}