Cod sursa(job #74146)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 24 iulie 2007 01:03:25
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.86 kb
#include <cstdio>
#include <string>
#define fin  "bool.in"
#define fout "bool.out"
#define Nmax 10001

#define DBGx
#define FL

char buff[Nmax],e[Nmax],epol[Nmax],v[256];
int N,dim,p,st[Nmax],dim1;
int grad[256];	//tin gradul operanzilor

void transf()
{
	int i;
	
	st[0]=0;
	dim1=0;

	for (i=1;i<=dim;++i)
	{
		if (e[i]>='A' && e[i]<='Z' || e[i]=='t' || e[i]=='f' )
			epol[++dim1]=e[i];
		else
			if (e[i]=='(')
				st[++st[0]]=e[i];
			else
			if (e[i]==')')
			{
				while (st[st[0]]!='(' && st[0]>0)
					epol[++dim1]=st[st[0]--];
				--st[0];
			}
			else
			{
				while ( (grad[(int)e[i]]<grad[st[st[0]]] || (grad[(int)e[i]]==grad[st[st[0]]] && e[i]!=st[st[0]]) )&& st[0]>0)
					epol[++dim1]=st[st[0]--];
				st[++st[0]]=e[i];
			}
#ifdef DBG
		for (int j=1;j<=st[0];++j)
			printf("%c",st[j]);
		printf("\n");
		for (int j=1;j<=dim1;++j)
			printf("%c",epol[j]);
		printf("\n");
#endif
	}
}

int eval()
{
	int i;
	st[0]=0;
	for (i=1;i<=dim1;++i)
	{
		if ('A'<=epol[i] && epol[i]<='Z' || epol[i]=='t' || epol[i]=='f')
			st[++st[0]]=v[(int)epol[i]];
		if (epol[i]=='!')
			st[st[0]]=!st[st[0]];
		if (epol[i]=='|')
		{
			st[st[0]-1]=(st[st[0]]|st[st[0]-1]);
			--st[0];
		}
		if (epol[i]=='&')
		{
			st[st[0]-1]=(st[st[0]]&st[st[0]-1]);
			--st[0];
		}
	}
	return st[1];
}

int main()
{
	int i;

	freopen(fin,"r",stdin);
#ifdef FL
	freopen(fout,"w",stdout);
#endif
	fgets(buff,Nmax,stdin);
#ifdef DBG	
	printf("%s\n",buff);
#endif
	dim=1; 
	e[dim]='(';
	
	for (i=0;buff[i]!='\n';)
	{
		if (buff[i]=='A')
			if (buff[i+1]!='N')
			{
				++i;
				e[++dim]='A';
			}
			else
			{
				i+=3;
				e[++dim]='&';
			}
		else
		if (buff[i]=='N')
			if (buff[i+1]!='O')
			{
				++i;
				e[++dim]='N';
			}
			else
			{
				i+=3;
				e[++dim]='!';
			}
		else
		if (buff[i]=='O')
			if (buff[i+1]!='R')
			{
				++i;
				e[++dim]='O';
			}
			else
			{
				i+=2;
				e[++dim]='|';
			}
		else
		if (buff[i]=='T')
			if (buff[i+1]!='R')
			{
				++i;
				e[++dim]='T';
			}
			else
			{
				i+=4;
				e[++dim]='t';
			}
		else
		if (buff[i]=='F')
			if (buff[i+1]!='A')
			{
				++i;
				e[++dim]='F';
			}
			else
			{
				i+=5;
				e[++dim]='f';
			}
		else
		if (buff[i]==')')
		{
			++i;
			e[++dim]=')';
		}
		else
		if (buff[i]=='(')
		{
			++i;
			e[++dim]='(';
		}
		else
		{
			if (buff[i]!=' ')
				e[++dim]=buff[i];
			++i;
		}	
	}
	++dim;
	e[dim]=')';

#ifdef DBG
	for (i=1;i<=dim;++i)
		printf("%c",e[i]);
	printf("\n");
#endif 
	
	grad[(int)'|']=1; 
	grad[(int)'&']=2;
	grad[(int)'!']=3;
	grad[(int)'(']=0;

	transf();	//transform expresia e in form poloneza postfixata
	
#ifdef DBG
	for (i=1;i<=dim1;++i)
		printf("%c",epol[i]);
	printf("\n");
#endif
	scanf("%d",&N);
	fgetc(stdin);

	v[(int)'t']=1; v[(int)'f']=0;

	memset(buff,'\n',sizeof(buff));
	fgets(buff,Nmax,stdin);

	for (i=0;i<N;++i)
		if ('A'<=buff[i] && buff[i]<='Z')
		{
			v[(int)buff[i]]=(!v[(int)buff[i]]);
			printf("%d",eval());
		}

	return 0;
}