Cod sursa(job #134702)

Utilizator ViksenVictor-Nicolae Savu Viksen Data 12 februarie 2008 08:22:32
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#include <string.h>
#define x F[l+1][i]
#define y B[l+1][i]
int A[2003][2003][2],F[2003][10],B[2003][10],n;
char s[2003];

void ReadData ()
{
    freopen ( "elimin2.in" , "r" , stdin );
    fgets ( s , 2003 , stdin );
    s[strlen(s)-1]=0;
}

void CountNumbers ( int l , int r )
{
    int i;
    if (l==r) A[l][r][0]=1,A[l][r][1]=s[l]-'0'; else
    for ( i=0 ; i<=9 ; i++ ) {
        if (x>=y , y<r ) {
            if (!A[x][y][0]) CountNumbers ( x , y );
            if (A[x][y][0]>=A[l][r][0]-2)
              A[l][r][0]=A[x][y][0]+ (y<r)?(2):(1),A[l][r][1]=s[l]-'0';
        }
    }

}

void Solve ()
{
    int l,r,i;
    l=0;r=strlen(s)-1;
    for ( i=1 ; i<=9 ; i++ ) {
        if (x<=y && y<=r) {
            if (!A[x][y]) CountNumbers ( x , y );
            if (A[x][y][0]>=A[l][r][0]-(y<r)?(2):(1))
              A[l][r][0]=A[x][y][0]+ (y<r)?(2):(1),A[l][r][1]=s[l]-'0';
        }
    }
}

void SetOrder ()
{
    int i;
    n=strlen(s);
    for ( i=0; i<=9 ; i++ ) { B[0][i]=-1; F[n][i]=n; }
    B[0][s[0]-'0']=0;
    for ( i=1 ; i<n ; i++ ) {
        memcpy ( B[i] , B[i-1] , 10*sizeof(int) );
        B[i][s[i]-'0']=i;
    }
    for ( i=n-1; i+1 ; i-- ) {
        memcpy ( F[i] , F[i+1] , 10*sizeof(int) );
        F[i][s[i]-'0']=i;
    }
}

int main ()
{
    ReadData ();
    SetOrder ();
    Solve ();
    return 0;
}