Cod sursa(job #568600)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 31 martie 2011 14:51:41
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define LMAX 1010

int N, i;
bool Lit[27];
char S[LMAX], c, *p;

inline int eval();
inline int termen();
inline int expr();

inline int expr()
{
	int rez;

	if( *p == 'N' && *(p+1) == 'O' )
	{
		p += 3;
		rez = expr();
		return !rez;
	}
	else if( *p == '(' )
	{
		++p;
		rez = eval();
		++p;

		return rez;
	}
	else if( *p == 'T' && *(p+1) == 'R' )
	{
		p += 4;
		return 1;
	}
	else if( *p == 'F' && *(p+1) == 'A' )
	{
		p += 5;
		return 0;
	}
	else
	{
		rez = Lit[ *p - 'A' ];
		++p;
		return rez;
	}
}

inline int termen()
{
	int rez = expr();

	for( ; *p == 'A' && *(p+1) == 'N'; p += 3, rez &= expr() );

	return rez;
}

inline int eval()
{
	int rez = termen();

	for( ; *p == 'O' && *(p+1) == 'R'; p += 2, rez |= termen() );

	return rez;
}

int main()
{
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);

	gets(S);
	p = strchr ( S, ' ' );
	while( p )
	{
		strcpy( p, p+1 );
		p = strchr( p, ' ' );
	}

	scanf("%d\n", &N);
	for( i=0; i<N; i++ )
	{
		scanf("%c", &c);
		Lit[ (int)( c-'A') ] = !Lit[ (int)( c-'A') ];

		p = S;
		printf("%d", eval() );
	}
	printf("\n");

	return 0;
}