Cod sursa(job #67726)

Utilizator victorsbVictor Rusu victorsb Data 25 iunie 2007 13:42:59
Problema Eval Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasele 11-12 Marime 1.54 kb
#include <cstdio>

#define Nmax 32
#define Lmax 100005

int n, pos;
int v[Nmax];
char sir[Lmax];

void citire()
{
    int i;
    
    scanf("%d\n", &n);
    for (i = 1; i <= n; ++i)
        scanf("%d\n", &v[i]);
    
    fgets(sir, Lmax, stdin);
}

int evalexp();

int evalterm()
{
    int sgn = 1, ret;
    
    while (sir[pos] == '-' || sir[pos] == '+')
    {
        if (sir[pos] == '-') sgn = -sgn;
        ++pos;
    }
    
    if (sir[pos] == '[')
    {
        ++pos;
        ret = evalexp();
        ++pos;
        return ret * ret * sgn;
    }
    else if (sir[pos] == '(')
    {
        ++pos;
        ret = evalexp();
        ++pos;
    }
    else if ('a' <= sir[pos] && sir[pos] <= 'z')
    {
         ret = v[sir[pos] - 'a' + 1];
         ++pos;
    }
    
    return sgn * ret;
}

int evalmul()
{
    int ret = 0;
    
    ret = evalterm();
    
    while (sir[pos] == '*')
    {
        ++pos;
        ret *= evalterm();
    }
    
    return ret;
}

int evalexp()
{
    int ret = 0, sgn;
    
    ret = evalmul();
    
    while (sir[pos] == '+' || sir[pos] == '-')
    {
        if (sir[pos] == '-') sgn = -1;
        else sgn = 1;
        ++pos;
        
        ret += sgn * evalmul();
    }
    
    return ret;
}
    
void solve()
{
    int i, ret;
    
    pos = 0;
    ret = evalexp();
    
    printf("%d\n", ret);
}

int main()
{
    freopen("eval.in", "r", stdin);
    freopen("eval.out", "w", stdout);
    citire();
    solve();
    return 0;
}