Cod sursa(job #2043469)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 20 octombrie 2017 08:44:23
Problema Eval Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <cstdio>
#include <cstring>
#define N 100005

using namespace std;

char ec[N];
int n, nr[27], lung;

int caut_prim(int start, int fin)
{
    for(int i=start;i<=fin;i++)
    {
        if(ec[i]=='(')
            while(ec[i+1]!=')')
                i++;
        else
            if((ec[i]=='+' || ec[i]=='-')&&!strchr("+*-", ec[i-1]) && !(strchr("+-", ec[i+1])))
                return i;
    }
    return -1;
}

int caut_doi(int start, int fin)
{
    for(int i=start;i<=fin;i++)
        if(ec[i]=='*')
            return i;
    return -1;
}

int parcurg(int st, int dr)
{
    if(st==dr && ec[st]!=')')
        return nr[ec[st]-'a'+1];
    if(ec[dr]==')')
        return parcurg(st, dr-1);
    int mij=caut_prim(st, dr);
    if(mij>0 && ec[mij]=='+')
        return parcurg(st, mij-1)+parcurg(mij+1, dr);
    else
        if(mij>0)
            return parcurg(st, mij-1)-parcurg(mij+1, dr);
    else
    {
        mij=caut_doi(st, dr);
        if(mij>0)
            return parcurg(st, mij-1)*parcurg(mij+1, dr);
        else
            if(ec[st]=='[')
                return parcurg(st+1, dr-1)*parcurg(st+1, dr-1);
            else
                if(ec[st]=='(')
                   return parcurg(st+1, dr);
                else
                    if(ec[st]=='-')
                        return -1*parcurg(st+1, dr);
                    else
                        if(ec[st]=='+')
                            return parcurg(st+1, dr);
    }
}

int main()
{
    freopen("eval.in", "r", stdin);
    freopen("eval.out", "w", stdout);


    scanf("%d\n", &n);
    for(int i=1;i<=n;i++)
        scanf("%d\n", &nr[i]);
    fgets(ec, N, stdin);
    lung=strlen(ec)-1;
    if(ec[lung]=='\n')
        lung--;
    printf("%d", parcurg(0, lung));
    return 0;
}