Pagini recente » Cod sursa (job #2152318) | Cod sursa (job #1680676) | Cod sursa (job #1073100) | Cod sursa (job #1025478) | Cod sursa (job #2474545)
#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 = 1; i < alpha; i++)
if(dr[1][i] != -1)
res = max(res, dp[dr[1][i]][st[n][i]]);
bool ok = true;
while(l <= r)
{
if(res <= 0)
break;
int start = 0;
if(ok == true)
{
ok = false;
start = 1;
}
for(int i = start; 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;
}