Cod sursa(job #635319)

Utilizator darkseekerBoaca Cosmin darkseeker Data 19 noiembrie 2011 10:17:44
Problema Ciuperci Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 4.78 kb
#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;
}