Pagini recente » Cod sursa (job #162292) | Cod sursa (job #352816) | Cod sursa (job #883935) | Cod sursa (job #1907553) | Cod sursa (job #2001695)
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("elimin2.in");
ofstream fout("elimin2.out");
short D[2005][2005], Next[2005][10], Prev[2005][10], L, first, last, n;
char s[2005], sol[2005];
inline void solve( int st, int dr, int lg ){
if( st > dr )
return;
if( lg < 0 )
return;
for( int i = 9; i >= 0; i-- ){
if( D[ Next[st][i] ][ Prev[dr][i] ] == lg ){
sol[first++] = (char)(i + '0');
sol[last--] = (char)(i + '0');
solve( Next[st][i] + 1, Prev[dr][i] - 1, lg - 2 );
return;
}
}
return;
}
int main(){
fin >> s + 1;
n = strlen( s + 1 );
for( int i = 1; i <= n; i++ ){
for( int j = 0; j <= 9; j++ ){
Prev[i][j] = Prev[i - 1][j];
}
Prev[i][ s[i] - '0' ] = i;
}
for( int i = 0; i <= 9; i++ )
Next[n + 1][i] = n + 1;
for( int i = n; i >= 1; i-- ){
for( int j = 0; j <= 9; j++ ){
Next[i][j] = Next[i + 1][j];
}
Next[i][ s[i] - '0' ] = i;
}
for( int i = 1; i <= n; i++ )
D[i][i] = 1;
for( int lg = 2; lg <= n; lg++ ){
for( int i = 1; i <= n - lg + 1; i++ ){
if( s[i] == s[i + lg - 1] ){
D[i][i + lg - 1] = max( D[i][i + lg - 1], (short)(2 + D[i + 1][i + lg - 2]) );
}else{
D[i][i + lg - 1] = max( D[i][i + lg - 1], max( D[i + 1][i + lg - 1], D[i][i + lg - 2] ) );
}
}
}
for( int i = 1; i <= 9; i++ ){
L = max( L, D[ Next[1][i] ][ Prev[n][i] ] );
}
first = 0;
last = L - 1;
solve( 1, n, L );
fout << sol;
return 0;
}