Cod sursa(job #94588)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 23 octombrie 2007 21:28:25
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>

#define fin  "bool.in"
#define fout "bool.out"

const int Nmax = 2048;

int N,p,a[40];
char s[Nmax];

void skip()
{
	while (s[p]==' ') ++p;
}

int var();
int eval();

int var()
{
	int ret;

	if (s[p]=='T' && s[p+1]=='R' && s[p+2]=='U' && s[p+3]=='E')
	{
		p+=4;
		skip();
		return 1;
	}

	if (s[p]=='F' && s[p+1]=='A' && s[p+2]=='L' && s[p+3]=='S' && s[p+4]=='E')
	{
		p+=5;
		skip();
		return 0;
	}

	ret=a[s[p]-'A'];

	++p;

	return ret;
}

int fact()
{
	int neg,ret,val;

	skip();

	neg=0;

	while ( s[p]=='N' && s[p+1]=='O' && s[p+2]=='T')
	{
		neg^=1;
		p+=3;
		skip();
	}

	if (s[p]=='(')
	{
		++p;
		ret=eval();
		++p;
		skip();
	}
	else
		ret=var();

	ret^=neg;

	skip();

	while (s[p]=='A' && s[p+1]=='N' && s[p+2]=='D')
	{	
		p+=3;
		skip();

		neg=0;

		while (s[p]=='N' && s[p+1]=='O' && s[p+2]=='T')
		{
			neg^=1;
			p+=3;
			skip();
		}

		if (s[p]=='(')
		{
			++p;
			val=eval();	
			++p;
		}
		else
			val=var();
		
		val=val^neg;
		ret=ret&val;

		skip();
	}

	return ret;
}

int eval()
{
	int val,ret;

	ret=fact();

	skip();

	while (s[p]=='O' && s[p+1]=='R')
	{
		p+=2;
		skip();	//sar spatii
		val=fact();
		ret=ret|val;
		skip();
	}

	return ret;
}

void readsolve()
{
	char i,ch;

	freopen(fin,"r",stdin);
	freopen(fout,"w",stdout);

	fgets(s,Nmax,stdin);
	
	scanf("%d\n",&N);
	
	for (i=0;i<N;++i)
	{
		scanf("%c",&ch);
		a[ch-'A']^=1;
		p=0;
		printf("%d",eval());
	}

	printf("\n");
}

int main()
{
	readsolve();
	return 0;
}