Pagini recente » Cod sursa (job #2552480) | Cod sursa (job #2115132) | Cod sursa (job #333351) | Cod sursa (job #729743) | Cod sursa (job #37848)
Cod sursa(job #37848)
#include <stdio.h>
#include <string.h>
#define FIN "elimin2.in"
#define FOUT "elimin2.out"
#define MAXN 2002
char A[MAXN], fin[MAXN];
short B[MAXN][MAXN];
int n;
int used[MAXN];
inline int max(int a, int b) {
return (a>b) ? a : b;
}
void debug()
{
int i, j;
fprintf(stderr," ");
for (i=1; i<=n; ++i)
fprintf(stderr,"%3d", A[n-i]-'0');
fprintf(stderr, "\n");
for (i=0; i<=n+1; ++i)
fprintf(stderr, "---");
fprintf(stderr, "\n");
for (i=1; i<=n; ++i) {
fprintf(stderr,"%3d| ", A[i-1]-'0');
for (j=1; j<=n; ++j)
fprintf(stderr,"%3d", B[i][j]);
fprintf(stderr,"\n");
}
}
int main()
{
int i, j, c=0;
freopen(FIN, "r", stdin);
freopen(FOUT,"w",stdout);
fgets(A, MAXN, stdin);
for (n=strlen(A); A[n-1] < '0'; --n) ;
/*
char st[MAXN];
for (i=0; i < (n/2); ++i)
st[i] = '0';
st[i] = 0;
if (char *k = strstr(A, st))
strcpy(k+(n/2), k);
*/
// n^2
for (i=1; i<=n; ++i)
for (j=1; j<=n; ++j) {
// if (A[i-1] == A[n-j] && B[i-1][j-1] == 0 && A[i-1] == '0')
// used[j-1] = 1;
if (A[i-1] == A[n-j])
B[i][j] = B[i-1][j-1] + 1;
else B[i][j] = max(B[i-1][j], B[i][j-1]);
}
debug();
for (i=n, j=n; B[i][j]; ) {
if (/*B[i][j] == B[i-1][j-1] + 1*/ A[i-1] == A[n-j]) {
fin[c++] = A[i-1];
i--, j--;
}
else {
if (B[i-1][j] > B[i][j-1]) --i;
else if (B[i][j-1] > B[i-1][j]) --j;
else {
// sunt egale...
if (A[i-1] > A[i-2] && j) // merg la stanga
--j;
else if (i) --i; // merg in sus
}
}
}
int dist = 0;
while (fin[dist] == '0') ++dist;
if (dist*2 == c) fin[0] = '0', dist=0, c=1;
for (i=c-1-dist; i>=dist; --i)
printf("%c", fin[i]);
printf("\n");
return 0;
}