Cod sursa(job #67515)

Utilizator astronomyAirinei Adrian astronomy Data 25 iunie 2007 10:53:22
Problema Eval Scor 20
Compilator c Status done
Runda preONI 2007, Runda Finala, Clasele 11-12 Marime 1.55 kb
#include <stdio.h>
#include <string.h>

#define MAX_N (1 << 17)

typedef long long real;

int N, i;
real V[64];
char A[MAX_N];

real expresie(void);
real termen(void);
real factor(void);

real expresie(void)
{
    real ret = termen();
    char sgn;

    while( i < N && (A[i] == '+' || A[i] == '-') )
    {
        sgn = A[i++];
        if(sgn == '+')
            ret += termen();
        else
            ret -= termen();
    }
    
    return ret;
}

real termen(void)
{
    real ret = factor();

    while(i < N && A[i] == '*')
        i++, ret *= factor();

    return ret;
}

real factor(void)
{
    int t = 0;
    real ret;
    
    if(A[i] >= 'a' && A[i] <= 'z')
    {
        ret = V[A[i]-'a'];
        i++;
        return ret;
    }
    
    if(A[i] == '(')
    {
        i++, ret = expresie(), i++;
        return ret;
    }

    if(A[i] == '[')
    {
        i++, ret = expresie(), i++;
        return ret*ret;
    }

    while(A[i] == '+' || A[i] == '-')
        t += (A[i] == '-'), i++;

    ret = factor();
    if(t&1)
        ret *= (-1);

    return ret;
}

void read_and_solve(void)
{
    int j, k, P, sgn;
    real ret;
    char sir[1024];

    scanf("%d\n", &P);
    for(j = 0; j < P; j++)
        scanf("%lld\n", &V[j]);
        
    scanf("%s\n", &A), N = strlen(A);

    ret = expresie();

    printf("%lld\n", ret);
}

int main(void)
{
    freopen("eval.in", "rt", stdin);
    freopen("eval.out", "wt", stdout);

    read_and_solve();

    return 0;
}