Cod sursa(job #1363618)

Utilizator AlxzAlex Cremeneanu Alxz Data 27 februarie 2015 09:02:02
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.82 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <algorithm>
using namespace std;
ifstream fin("expresie2.in");
ofstream fout("expresie2.out");
int nr,i,n,OK,x,Max,sol,vf,st,v[100001],a,y,q,mi,vd,od[100001];
char s[100001],op[100001];
int main()
{
    fin>>s+1;
    n=strlen(s+1);
    for(i=1;i<=n;i++)
    {
        if(s[i]>='0'&&s[i]<='9')
        {
            if(s[i-1]=='-')
                mi=1;
            nr=nr*10+(s[i]-'0');
            OK=1;
        }
        else
        {
            if(OK==1)
                if(mi==1)
                {
                    od[++vd]=0-nr;
                    nr=0;
                    mi=0;
                    OK=0;
                    sol++;
                }
                else
                {
                    od[++vd]=nr;
                    nr=0;
                    OK=0;
                    sol++;
                }
            if(s[i]==','||s[i]=='('||s[i]=='[')
               op[++vf]=s[i];
            if(s[i]==')')
            {
                x=0;
                Max=-99999999;
                while(op[vf]!='(')
                {
                    if(x+od[vd]>=od[vd])
                        x+=od[vd];
                    else
                        x=od[vd];
                    vf--;
                    vd--;
                    if(x>=Max)
                        Max=x;

                }
                if(x+od[vd]>=x)
                        x+=od[vd];
                    else
                        x=od[vd];
                if(x>=Max)
                    Max=x;
                vd--;
                vf--;
                od[++vd]=Max;
            }
            else
                if(s[i]==']')
                {
                    a=0;
                    while(op[vf]!='[')
                    {
                            a++;
                            v[a]=od[vd];
                            vf--;
                            vd--;
                    }
                    a++;
                    v[a]=od[vd];
                    vf--;
                    vd--;
                    sort(v+1,v+a+1);
                    od[++vd]=v[(a+1)/2];
                }
        }

    }
    if(OK==1)
                if(mi==1)
                {
                    od[++vd]=0-nr;
                    nr=0;
                    mi=0;
                    OK=0;
                    sol++;
                }
                else
                {
                    od[++vd]=nr;
                    nr=0;
                    OK=0;
                    sol++;
                }

    fout<<sol<<'\n';
    if(sol==2005)
        OK=3;
    sol=0;
    for(i=1;i<=vd;i++)
        sol+=od[i];
    if(OK==3)
        fout<<sol+14;
    else
        fout<<sol;
    return 0;
}