Cod sursa(job #2042805)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 19 octombrie 2017 10:48:58
Problema Eval Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 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]=='+' || ec[i]=='-')
            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(st==dr)
        return 0;
    int mij=caut_prim(st, dr);
    if(mij>0 && ec[mij]=='+')
        if(ec[mij-1]=='+' || ec[mij-1]=='-' || ec[mij-1]=='*')
            return parcurg(mij+1, dr);
        else
            return parcurg(st, mij-1)+parcurg(mij+1, dr);
    else
        if(mij>0)
            if(ec[mij-1]=='+' || ec[mij-1]=='-' || ec[mij-1]=='*')
                return -1*parcurg(mij+1, dr);
            else
                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);
    }
}

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;
    printf("%d", parcurg(0, lung));
    return 0;
}