Cod sursa(job #37848)

Utilizator sandyxpSanduleac Dan sandyxp Data 25 martie 2007 12:49:42
Problema Elimin 2 Scor 20
Compilator cpp Status done
Runda preONI 2007, Runda 4, Clasa a 10-a Marime 1.96 kb
#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;
}