Cod sursa(job #74252)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 24 iulie 2007 13:36:41
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.32 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,poz[Nmax];
int grad[256];	//tin gradul operanzilor
char tmp[Nmax];

int eval()
{
	int i,j;
	
	for (i=1;i<=dim;++i)
		if ('A'<=e[i] && e[i]<='Z' || e[i]=='t' || e[i]=='f')
			tmp[i]=v[e[i]];
		else
			tmp[i]=e[i];
	dim1=dim;
	while (dim1>1)
	{
		//rez NOT
		for (i=1;i<=dim1;++i)
			if (tmp[i]=='!' && (tmp[i+1]==0 || tmp[i+1]==1))
			{
				tmp[i]=(!tmp[i+1]);
				for (j=i+1;j<dim1;++j)
					tmp[j]=tmp[j+1];
				--dim1;
			}
#ifdef DBG
		for (i=1;i<=dim1;++i)
			if (tmp[i]!=0 && tmp[i]!=1)
				printf("%c",tmp[i]);
			else
				printf("%c",tmp[i]+'0');
		printf("\n");
#endif
		//rez SI
		for (i=1;i<=dim1;++i)
			if (tmp[i]=='&' && (tmp[i-1]==0 || tmp[i-1]==1) && (tmp[i+1]==0 || tmp[i+1]==1))
			{
				tmp[i-1]=(tmp[i-1]&tmp[i+1]);
				for (j=i;j<dim1-1;++j)
					tmp[j]=tmp[j+2];
				dim1-=2;
			}
#ifdef DBG		
		for (i=1;i<=dim1;++i)
			if (tmp[i]!=0 && tmp[i]!=1)
				printf("%c",tmp[i]);
			else
				printf("%c",tmp[i]+'0');
		printf("\n");
#endif
		//rez SAU
		for (i=1;i<=dim1;++i)
			if (tmp[i]=='|' && (tmp[i-1]==0 || tmp[i-1]==1) && (tmp[i+1]==0 || tmp[i+1]==1) && tmp[i+2]!='&')
			{
				tmp[i-1]=(tmp[i-1]|tmp[i+1]);
				for (j=i;j<dim1-1;++j)
					tmp[j]=tmp[j+2];
				dim1-=2;
			}
#ifdef DBG		
		for (i=1;i<=dim1;++i)
			if (tmp[i]!=0 && tmp[i]!=1)
				printf("%c",tmp[i]);
			else
				printf("%c",tmp[i]+'0');
		printf("\n");
#endif

		//rez ()
		for (i=1;i<=dim1;++i)
			if ( (tmp[i]==0 || tmp[i]==1) && tmp[i-1]=='(' && tmp[i+1]==')')
			{
				tmp[i-1]=tmp[i];
				for (j=i;j<dim1;++j)
					tmp[j]=tmp[j+2];
				dim1-=2;
			}
#ifdef DBG
		for (i=1;i<=dim1;++i)
			if (tmp[i]!=0 && tmp[i]!=1)
				printf("%c",tmp[i]);
			else
				printf("%c",tmp[i]+'0');
		printf("\n\n");
#endif
	}

	return tmp[1];
}

int main()
{
	int i;
	char c;

	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' || buff[i+2]!='D')
			{
				++i;
				e[++dim]='A';
			}
			else
			{
				i+=3;
				e[++dim]='&';
			}
		else
		if (buff[i]=='N')
			if (buff[i+1]!='O' || buff[i+2]!='T')
			{
				++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' || buff[i+2]!='U' || buff[i+3]!='E')
			{
				++i;
				e[++dim]='T';
			}
			else
			{
				i+=4;
				e[++dim]='t';
			}
		else
		if (buff[i]=='F')
			if (buff[i+1]!='A' || buff[i+2]!='L' || buff[i+3]!='S' || buff[i+4]!='E')
			{
				++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 
	
	scanf("%d",&N);
	fgetc(stdin);

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

	for (i=0;i<N;++i)
	{
		c=fgetc(stdin);	
		v[(int)c]=(!v[(int)c]);
		printf("%d",eval());
	}
	printf("\n");
	return 0;
}