Pagini recente » Cod sursa (job #917999) | Cod sursa (job #684126) | Cod sursa (job #98050) | Cod sursa (job #21558) | Cod sursa (job #559781)
Cod sursa(job #559781)
# include <cstdio>
# include <cstring>
const char *FIN = "elimin2.in", *FOU = "elimin2.out" ;
const int MAX = 2005, CAX = 10 ;
char S[MAX], sol[MAX] ;
short L[MAX][MAX], LEFT[MAX][CAX], RIGHT[MAX][CAX] ;
int N ;
inline int max ( int A, int B ) {
return ( A > B ? A : B ) ;
}
int main ( void ) {
fscanf ( fopen ( FIN, "r" ) , "%s", S ), N = strlen ( S ) ;
for ( int i = 0; i < CAX; ++i ) {
LEFT[N][i] = N, RIGHT[0][i] = ( S[0] - '0' == i ? 0 : -1 ) ;
}
for ( int i = N - 1; i + 1; --i ) {
for ( int j = 0; j < CAX; ++j ) {
LEFT[i][j] = ( S[i] - '0' == j ? i : LEFT[i + 1][j] ) ;
}
}
for ( int i = 1; i < N; ++i ) {
for ( int j = 0; j < CAX; ++j ) {
RIGHT[i][j] = ( S[i] - '0' == j ? i : RIGHT[i - 1][j] ) ;
}
}
for ( int i = 0; i + 1 < N; ++i ) {
L[i][i] = 1, L[i][i + 1] = 1 + ( S[i] == S[i + 1] ) ;
}
L[N - 1][N - 1] = 1 ;
for ( int c = 2; c < N; ++c ) {
for ( int i = 0; i + c < N; ++i ) {
L[i][i + c] = ( S[i] == S[i + c] ? L[i + 1][i + c - 1] + 2 : max ( L[i][i + c - 1], L[i + 1][i + c] ) ) ;
}
}
for ( int i = 0, j = N - 1, k = 0; i <= j; ) {
for ( int c = CAX - 1; c + 1; --c ) {
int l = LEFT[i][c], r = RIGHT[j][c] ;
if ( l <= r && L[i][j] == L[l + 1][r - 1] + ( l != r ) + 1 ) {
sol[k] = sol[L[0][N - 1] - k - 1] = c + '0' ;
i = l + 1, j = r - 1, ++k ;
break ;
}
}
}
int ii, jj ;
for ( ii = 0, jj = L[0][N - 1] - 1; ii <= jj && sol[ii] == '0' && sol[jj] == '0' ; ++ii, --jj ) ;
freopen ( FOU, "w", stdout ) ;
for ( int i = ii; i <= jj; ++i ) {
printf ( "%c", sol[i] ) ;
}
}