Pagini recente » Cod sursa (job #2936784) | Cod sursa (job #2228304) | Cod sursa (job #1220892) | Cod sursa (job #1167059) | Cod sursa (job #635319)
Cod sursa(job #635319)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define NMAX 100005
#define Input "expresie2.in"
#define Output "expresie2.out"
using namespace std;
char sir[NMAX];
int val=0,nrcifre=0,indice,adancime;
int *st[NMAX];
int evalPatrat(char*);
int evalRot(char*);
int charToInt(char c)
{
switch(c)
{
case '1':return 1;break;
case '2':return 2;break;
case '3':return 3;break;
case '4':return 4;break;
case '5':return 5;break;
case '6':return 6;break;
case '7':return 7;break;
case '8':return 8;break;
case '9':return 9;break;
case '0':return 0;break;
}
return 0;
}
int evalRot(char *sir)
{
int best=0,curent=0,maxim=-9999999,nr,valoare;
while(sir[indice]!=')')
{
nr=0;
if(sir[indice]==',')
indice++;
if(sir[indice]=='-')
if(sir[indice+2]>='0' && sir[indice+2] <='9')
{
nrcifre++;
nr*=10;
nr+=charToInt(sir[indice+1]);
nr*=10;
nr+=charToInt(sir[indice+2]);
nr*=-1;
indice+=3;
}
else
{
nrcifre++;
nr*=10;
nr+=charToInt(sir[indice+1]);
nr*=-1;
indice+=2;
}
if(sir[indice]!='-' && sir[indice]>='0' && sir[indice]<='9')
if(sir[indice+1]>='0' && sir[indice+1] <='9')
{
nrcifre++;
nr*=10;
nr+=charToInt(sir[indice]);
nr*=10;
nr+=charToInt(sir[indice+1]);
indice+=2;
}
else
{
nrcifre++;
nr*=10;
nr+=charToInt(sir[indice]);
indice+=1;
}
if(curent+nr>=0)
{
if(nr>maxim)
maxim=nr;
curent+=nr;
nr=0;
if(curent>best)
best=curent;
}
else
{
if(nr>maxim)
maxim=nr;
curent=0;
nr=0;
}
if(sir[indice]=='(')
{
indice++;
valoare=evalRot(sir);
if(valoare>maxim)
maxim=valoare;
if(curent+valoare>=0)
curent+=valoare;
else
curent=0;
if(curent>best)
best=curent;
}
if(sir[indice]=='[')
{
indice++;
valoare=evalPatrat(sir);
if(valoare>maxim)
maxim=valoare;
if(curent+valoare>=0)
curent+=valoare;
else
curent=0;
if(curent>best)
best=curent;
}
}
indice++;
if(best)
return best;
else
return maxim;
}
void push(int val,int poz)
{
st[poz][0]++;
st[poz]=(int*)realloc(st[poz],(st[poz][0]+1)*(sizeof(int)));
st[poz][st[poz][0]]=val;
}
int evalPatrat(char *sir)
{
int lg=0,valoare,nr,retval;
adancime++;
st[adancime]=(int*)realloc(st[adancime],sizeof(int));
st[adancime][0]=0;
while(sir[indice]!=']')
{
nr=0;
if(sir[indice]==',')
indice++;
if(sir[indice]=='-')
if(sir[indice+2]>='0' && sir[indice+2] <='9')
{
nrcifre++;
nr*=10;
nr+=charToInt(sir[indice+1]);
nr*=10;
nr+=charToInt(sir[indice+2]);
nr*=-1;
indice+=3;
push(nr,adancime);
}
else
{
nrcifre++;
nr*=10;
nr+=charToInt(sir[indice+1]);
nr*=-1;
indice+=2;
push(nr,adancime);
}
if(sir[indice]!='-' && sir[indice]>='0' && sir[indice]<='9')
if(sir[indice+1]>='0' && sir[indice+1] <='9')
{
nrcifre++;
nr*=10;
nr+=charToInt(sir[indice]);
nr*=10;
nr+=charToInt(sir[indice+1]);
indice+=2;
push(nr,adancime);
}
else
{
nrcifre++;
nr*=10;
nr+=charToInt(sir[indice]);
push(nr,adancime);
indice+=1;
}
if(sir[indice]=='[')
{
indice++;
valoare=evalPatrat(sir);
push(valoare,adancime);
}
if(sir[indice]=='(')
{
indice++;
valoare=evalRot(sir);
push(valoare,adancime);
}
}
indice++;
sort(st[adancime]+1,st[adancime]+st[adancime][0]+1);
retval=st[adancime][(st[adancime][0]+1)/2];
adancime--;
return retval;
}
int main()
{
freopen (Input,"r",stdin);
freopen (Output,"w",stdout);
int i,lg,nr=0;
fgets(sir,NMAX,stdin);
lg=strlen(sir);
if(sir[lg-1]=='\n')
lg--;
for(indice=0;indice<lg;indice++)
{
nr=0;
if(sir[indice]==',')
indice++;
if(sir[indice]=='-')
if(sir[indice+2]>='0' && sir[indice+2] <='9')
{
nrcifre++;
nr*=10;
nr+=charToInt(sir[indice+1]);
nr*=10;
nr+=charToInt(sir[indice+2]);
nr*=-1;
indice+=3;
}
else
{
nrcifre++;
nr*=10;
nr+=charToInt(sir[indice+1]);
nr*=-1;
indice+=2;
}
if(sir[indice]!='-' && sir[indice]>='0' && sir[indice]<='9')
if(sir[indice+1]>='0' && sir[indice+1] <='9')
{
nrcifre++;
nr*=10;
nr+=charToInt(sir[indice]);
nr*=10;
nr+=charToInt(sir[indice+1]);
indice+=2;
}
else
{
nrcifre++;
nr*=10;
nr+=charToInt(sir[indice]);
indice+=1;
}
val+=nr;
if(sir[indice]=='(')
{
indice++;
val+=evalRot(sir);
}
if(sir[indice]=='[')
{
indice++;
val+=evalPatrat(sir);
}
}
printf("%d\n%d\n",nrcifre,val);
return 0;
}