Cod sursa(job #594994)

Utilizator SpiderManSimoiu Robert SpiderMan Data 10 iunie 2011 18:29:58
Problema Expresii 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.14 kb
# include <algorithm>
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std ;

typedef vector < int > VC ;
typedef VC :: iterator IT ;
const char *FIN = "expresie2.in", *FOU = "expresie2.out" ;
const int MAX = 100005 ;

char S[MAX] ;
int semn = 1, sol = 0, c = 0, d = 0 ;
VC B ;

inline bool cifra ( char X ) {
    return ( X >= '0' && X <= '9' ) ;
}

inline void verf ( int &sum, int x, int &maxi ) {
    sum < 0 ? sum = x : sum += x ;
    if ( maxi < sum ) {
        maxi = sum ;
    }
}


int eval2 ( int &poz, VC B ) ;

int eval1 ( int &poz ) {
    int semn = 1, maxi = -0x3f3f3f3, x, sum = 0 ;
    for ( poz = poz + 1; S[poz] != ')'; ++poz ) {
        if ( cifra ( S[poz] ) ) {
            if ( !cifra ( S[poz + 1] ) ) {
                x = semn * ( S[poz] - '0' ), semn = 1, ++c ;
            } else {
                x = semn * (( S[poz] - '0' ) * 10 + (S[poz + 1] - '0')), semn = 1, ++poz, ++c ;
            }
            verf ( sum, x, maxi ) ;
        } else if ( S[poz] == '-' ) {
            semn = - 1 ;
        } else if ( S[poz] == ',' ) {
            continue ;
        } else if ( S[poz] == '(' ) {
            x = semn * eval1 ( poz ), semn = 1, ++d, ++c ;
            verf ( sum, x, maxi ) ;
        } else if ( S[poz] == '[' ) {
            x = semn * eval2 ( poz, B ), semn = 1, ++d, ++c ;
            verf ( sum, x, maxi ) ;
        }
    }
    return maxi ;

}

int eval2 ( int &poz, VC B ) {
    int semn = 1 ;
    for ( poz = poz + 1; S[poz] != ']'; ++poz ) {
        if ( cifra ( S[poz] ) ) {
            if ( !cifra ( S[poz + 1] ) ) {
                B.push_back ( semn * ( S[poz] - '0' ) ), semn = 1 ;
            } else {
                B.push_back ( semn * (( S[poz] - '0' ) * 10 + (S[poz + 1] - '0')) ), semn = 1, ++poz ;
            }
        } else if ( S[poz] == '-' ) {
            semn = - 1 ;
        } else if ( S[poz] == ',' ) {
            continue ;
        } else if ( S[poz] == '(' ) {
            B.push_back ( semn * eval1 ( poz ) ), semn = 1, ++d ;
        } else if ( S[poz] == '[' ) {
            VC X ;
            int sl = eval2 ( poz, X ) ;
            B.push_back ( semn * sl ), semn = 1, ++d ;
        }
    }
    c += B.size () ;
    IT iter = ( B.begin () + ( B.size () + 1 ) / 2 - 1 ) ;
    nth_element ( B.begin (), iter, B.end () ), B.clear () ;
    return *iter ;
}

int main ( void ) {
    fscanf ( fopen ( FIN, "r" ) , "%s", S ) ;

    for ( int i = 0, j = strlen ( S ); i < j; ++i ) {
        if ( cifra ( S[i] ) ) {
            if ( !cifra ( S[i + 1] ) ) {
                sol += semn * ( S[i] - '0' ), semn = 1, ++c ;
            } else {
                sol += semn * (( S[i] - '0' ) * 10 + (S[i + 1] - '0')), semn = 1, ++c, ++i ;
            }
        } else if ( S[i] == ',' ) {
            continue ;
        } else if ( S[i] == '-' ) {
            semn = - 1;
        } else if ( S[i] == '(' ) {
            sol += semn * eval1 ( i ), semn = 1 ;
        } else if ( S[i] == '[' ) {
            sol += semn * eval2 ( i, B ), semn = 1 ;
        }
    }
    fprintf ( fopen ( FOU, "w" ), "%d\n%d\n", c - d, sol ) ;
}