Cod sursa(job #301867)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 8 aprilie 2009 14:58:15
Problema Bool Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <cstring>

#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define IN  "bool.in"
#define OUT "bool.out"

int N,hmax = 3;
char *p,A[1<<10],S[1<<10];
bool V[1<<10];

void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	fgets(A,1<<10,stdin);
	scanf("%d\n",&N);
	fgets(S,1<<10,stdin);
}

int eval();int f1();int f2();int f3();

int eval()
{

	int r = 0;
	for(r = f1();*p == '|';++p, r |= f1() );
	return r;
}

int f1()
{

	int r = 0;
	for(r = f2();*p == '&';++p, r &= f2() );
	return r;
}

int f2()
{

	int r = 0;
	for(r = f3();*p == '!';++p,r != f3() );
	return r;
}

int f3()
{
	
	int r = 0;
	if(*p == '(')
	{
		++p;
		r = eval();
		++p;
	}

	else
	{
		if( (*p >= 'A' && *p <= 'Z') || *p == '0' || *p == '1')
			r = V[(int) *p ], ++p;
	}
	return r;
}


void solve()
{
	int j(-1);
	V[(int)'1'] = 1;
	for(int i=0;A[i] != '\n' && A[i] != '\0';++i)
	{
		if(A[i] == ' ')
			continue;
		if(A[i] == 'T' && A[i+1] == 'R')
		{
			A[++j] = '1';
			i += 4;
			continue;
		}
		if(A[i] == 'F' && A[i+1] == 'A')
		{
			A[++j] = '0';
			i += 5;
			continue;
		}
		if(A[i] == 'A' && A[i+1] == 'N')
		{
			A[++j] = '&';
			i += 3;
			continue;
		}
		if(A[i] == 'O' && A[i+1] == 'R')
		{
			A[++j] = '|';
			i += 2;
			continue;
		}	
		if(A[i] == 'N' && A[i+1] == 'O')
		{
			A[++j] = '!';
			i += 3;
			continue;
		}
		A[++j] = A[i];
	}
	A[++j] = '\0';
//	FOR(i,0,j-1)
//		printf("%c",A[i]);
	
	FOR(i,0,N-1)
	{
		p = A;
		V[ (int)S[i] ] = !V[ (int)S[i] ];
		printf("%d",eval() );
	}
}

int main()
{
	scan();
	solve();
	return 0;
}