Cod sursa(job #282081)

Utilizator space.foldingAdrian Soucup space.folding Data 16 martie 2009 20:39:21
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <stdio.h>

char Expression[1001], *p=Expression;
int Alphabet[30];

int EvaluateExpression();
int EvaluateOr();
int EvaluateAnd();
int EvaluateNot();

int EvaluateExpression()
{
	int Result;
	Result=EvaluateOr();
	while(*p == 'O' && *(p+1) == 'R')
	{
		p+=3;
		Result|=EvaluateOr();
	}
	return Result;
}

int EvaluateOr()
{
	int Result;
	Result=EvaluateAnd();
	while(*p == 'A' && *(p+1) == 'N' && *(p+2) == 'D')
	{
		p+=4;
		Result&=EvaluateAnd();
	}
	return Result;
}

int EvaluateAnd()
{
	int Result;
	if(*p == 'N' && *(p+1) == 'O' && *(p+2) == 'T')
	{
		p+=4;
		Result=EvaluateNot()^1;
	}
	else
		Result=EvaluateNot();
	return Result;
}

int EvaluateNot()
{
	int Result;
	
	if(*p=='(')
	{
		++p;
		Result=EvaluateExpression();
		++p;
	}
	else
		if(*p=='F' && *(p+1)=='A' && *(p+2)=='L' && *(p+3)=='S' && *(p+4)=='E')
			p+=6, Result=0;
	else
		if(*p=='T' && *(p+1)=='R' && *(p+2)=='U' && *(p+3)=='E')
			p+=5, Result=1;
	else
		Result=Alphabet[*p-'A'], p+=2;
	return Result;
}
int main ()
{
	char c;
	int N, i;
	freopen("bool.in", "r", stdin);
	freopen("bool.out", "w", stdout);

	do
	{
		scanf("%c", p++);
	}
	while(*(p-1)!='\n');
	
	scanf("%d\n", &N);
	for(i=0; i<N; ++i)
	{
		scanf("%c", &c);
		Alphabet[c-'A']^=1;
		p=Expression;
		printf("%d", EvaluateExpression());
	}
	return 0;
}