Cod sursa(job #1825959)

Utilizator andru47Stefanescu Andru andru47 Data 9 decembrie 2016 21:49:38
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <climits>
using namespace std;
int ret,ret1,len;
char s[100005];
inline int numar(int &i)
{
    int nr = 0,inm = 1;
    ++ret1;
    if (s[i]=='-')
        inm = -1,
        ++i;
    for ( ; i<=len&&isdigit(s[i]); ++i,nr*=10)
        nr+=s[i]-'0';
    nr /= 10;
    return nr*inm;
}
inline int solve(int &i,int paran)
{
    int chr;
    if (paran == 1)
    {
        int smax = -INT_MAX,nrmax = -INT_MAX,sum=0;
        ++i;
        while (s[i]!=')')
        {
            int local;
            if(isdigit(s[i])||s[i]=='-')
                local = numar(i);

            else if (s[i]==',')
            {
                ++i;
                continue;
            }
            else if (s[i]=='(')
                local = solve(i,1);
            else if (s[i]=='[')local = solve(i,2);

            if (local>nrmax)nrmax = local;
            sum += local;
            smax = max(sum,smax);
            if (sum<0)
                sum = 0;
        }
        ++i;
        return max(smax,nrmax);
    }
    else
    {
        vector <int> v;
        int in = 0;
        v.push_back(INT_MIN+3);
        ++i;
        while(s[i]!=']')
        {
            int local ;
            if(isdigit(s[i])||s[i]=='-')
                local = numar(i),++in;
            else if (s[i]==',')
            {
                ++i;
                continue;
            }
            else if (s[i]=='(')
                local = solve(i,1),++in;
            else if (s[i]=='[')local = solve(i,2),++in;
            v.push_back(local);
        }
        sort(v.begin(),v.end());
        int lenn = v.size();
        ++i;
        return v[(in+1)/2];
    }
}
int main()
{
    freopen("expresie2.in","r",stdin);
    freopen("expresie2.out","w",stdout);
    gets(s+1);
    int i = 1;
    len = strlen(s+1);
    while(i <= len)
    {
        if(isdigit(s[i])||s[i]=='-')
            ret += numar(i);
        else if (s[i]==',')
            ++i;
        else if (s[i]=='(')
            ret += solve(i,1);
        else ret += solve(i,2);
    }
    printf("%d\n%d", ret1 , ret);
    return 0;
}