Cod sursa(job #3369255)

Utilizator sandrsSandra Paul sandrs Data 18 octombrie 2026 17:37:45
Problema Eval Scor Ascuns
Compilator cpp-64 Status waiting
Runda Arhiva de probleme Marime 2.53 kb
#include <fstream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <deque>
#include <string>
#include <unordered_map>
#include <vector>
#include <stack>
#include <deque>
using namespace std;
ifstream cin("eval.in");
ofstream cout("eval.out");

stack<long long> st;
const long long ad=1e15, sc=ad+1, ori=ad+2, imp=ad+3, par=ad+4, pat=ad+5, minu=ad+6, plu=ad+7;
long long v[26];

void aplica()
{
    while(!st.empty())
    {
        long long x=st.top();
        st.pop();
        if(st.empty())
        {
            st.push(x);
            return;
        }
        if(st.top()==minu)
        {
            st.pop();
            st.push(-x);
        }
        else if(st.top()==plu)
        {
            st.pop();
            st.push(x);
        }
        else if(st.top()==ori)
        {
            st.pop();
            x*=st.top();
            st.pop();
            st.push(x);
        }
        else
        {
            st.push(x);
            return;
        }
    }
}

void aduna()
{
    long long x=st.top();
    st.pop();
    if(!st.empty() && (st.top()==ad || st.top()==sc))
    {
        long long c=st.top();
        st.pop();
        long long y=st.top();
        st.pop();
        if(c==ad)
            st.push(y+x);
        else
            st.push(y-x);
    }
    else
        st.push(x);
}

int main()
{
    int n;
    string s;
    cin >> n;
    for(int i=0; i<n; i++)
        cin >> v[i];
    cin >> s;
    bool unar=true;
    for(int i=0; i<(int)s.size(); i++)
    {
        if(s[i]>='a' && s[i]<='z')
        {
            st.push(v[s[i]-'a']);
            aplica();
            unar=false;
        }
        else if(s[i]=='(')
        {
            st.push(par);
            unar=true;
        }
        else if(s[i]=='[')
        {
            st.push(pat);
            unar=true;
        }
        else if(s[i]==')' || s[i]==']')
        {
            aduna();
            long long x=st.top();
            st.pop();
            st.pop();
            if(s[i]==']')
                x*=x;
            st.push(x);
            aplica();
            unar=false;
        }
        else if(s[i]=='*')
        {
            st.push(ori);
            unar=true;
        }
        else if(unar)
        {
            if(s[i]=='-')
                st.push(minu);
            else
                st.push(plu);
        }
        else
        {
            aduna();
            if(s[i]=='+')
                st.push(ad);
            else
                st.push(sc);
            unar=true;
        }
    }

    aduna();
    cout << st.top();

    return 0;
}