Cod sursa(job #2474544)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 15 octombrie 2019 15:15:34
Problema Elimin 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

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

const int alpha = 10;
const int DIM = 2007;

int st[DIM][alpha];
int dr[DIM][alpha];

int dp[DIM][DIM];

main()
{
	string s;
	fin >> s;
	
	int n = s.size();
	
	s = ' ' + s;
	
	for(int i = 0; i < alpha; i++)
		st[0][i] = dr[n + 1][i] = -1;
	
	for(int i = 1; i <= n; i++)
	{
		for(int j = 0; j < alpha; j++)
			st[i][j] = st[i - 1][j];
			
		st[i][s[i] - '0'] = i;
	}
	
	for(int i = n; i >= 1; i--)
	{
		for(int j = 0; j < alpha; j++)
			dr[i][j] = dr[i + 1][j];
		
		dr[i][s[i] - '0'] = i;
	}
	
	for(int i = 1; i <= n; i++)
		dp[i][i] = 1;
	
	for(int len = 2; len <= n; len++)
		for(int 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]);
	
	int res = 0;
	int l = 1;
	int r = n;
	
	string sol;
	string rev;
	
	for(int i = 0; i < alpha; i++)
		if(dr[1][i] != -1)
			res = max(res, dp[dr[1][i]][st[n][i]]);
	
	while(l <= r)
	{
		if(res <= 0)
			break;
		
		for(int i = 0; i < alpha; i++)
			if(dr[l][i] != -1 && dp[dr[l][i]][st[r][i]] == res)
			{
				res--;
				sol.push_back(char(i + '0'));
				
				l = dr[l][i];
				r = st[r][i];
				
				if(l != r)
				{
					rev.push_back(char(i + '0'));
					res--;
				}
				
				l++;
				r--;
				
				break;
			}
	}
	
	reverse(rev.begin(), rev.end());
	
	fout << sol << rev;
}