Cod sursa(job #198120)

Utilizator AndreyPAndrei Poenaru AndreyP Data 8 iulie 2008 16:40:49
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<stdio.h>
#include<string.h>
char c[1010];
int s[1010],n,*p;
bool val[100];
bool eval();
bool factor()
{
	bool r;
	if(*p>0)
	{
		r=val[*p];
		p++;
	}
	else
	if(*p==-1)
	{
		p++;
		r=!(factor());
	}
	else
	if(*p==-5)
	{
		p++;
		r=eval();
		p++;
	}
	return r;
}
bool termen()
{
	bool r=factor();
	while(*p==-2)
	{
		p++;
		r&=factor();
	}
	return r;
}
bool eval()
{
	bool r=termen();
	while(*p==-3)
	{
		p++;
		r|=termen();
	}
	return r;
}
int main()
{
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	fgets(c,1010,stdin);
	int lim=strlen(c)-1,acu=-1;
	for(int i=0; i<lim; i++)
	{
		switch(c[i])
		{
			case 'F':
				if(c[i+1]=='A')
				{
					s[++acu]=30;
					i+=4;
				}
				else
					s[++acu]=c[i]-'A'+1;
				break;
			case 'T':
				if(c[i+1]=='R')
				{
					s[++acu]=31;
					i+=3;
				}
				else
					s[++acu]=c[i]-'A'+1;
				break;
			case 'N':
				if(c[i+1]=='O')
				{
					s[++acu]=-1;
					i+=2;
				}
				else
					s[++acu]=c[i]-'A'+1;
				break;
			case 'A':
				if(c[i+1]=='N')
				{
					s[++acu]=-2;
					i+=2;
				}
				else
					s[++acu]=c[i]-'A'+1;
				break;
			case 'O':
				if(c[i+1]=='R')
				{
					s[++acu]=-3;
					i++;
				}
				else
					s[++acu]=c[i]-'A'+1;
				break;
			case '(':
				s[++acu]=-5;
				break;
			case ')':
				s[++acu]=-4;
				break;
			case ' ':
				break;
			default:
				s[++acu]=c[i]-'A'+1;
		}
	}
	val[31]=true;
	scanf("%d\n",&n);
	char aux;
	for(int i=0; i<n; i++)
	{
		scanf("%c",&aux);
		p=s;
		if(val[aux-'A'+1])
			val[aux-'A'+1]=0;
		else
			val[aux-'A'+1]=1;
		printf("%d",eval() ? 1 : 0);
	}
	printf("\n");
	return 0;
}