Cod sursa(job #568578)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 31 martie 2011 14:16:50
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 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 bool eval();

inline bool termen()
{
	bool rez;
	char test[10] = {0}, T;

	if( *p == '(' )
	{
		++p;
		rez = eval();
		++p;

		return rez;
	}
	else
	{
		for( ; isalpha( *p ) && *p ; test[strlen(test)] = *p, p++ );

		if( strlen(test) == 1 ) return Lit[ (int)( test[0]-'A' ) ] ;
		else if ( !strcmp( test, "TRUE" ) ) return true;
		else
		{
			++p;
			if( *p == '(' ) rez = !eval();
			else 
			{
				T = *(++p-1);
				return !Lit[ (int)( T-'A' ) ];
			}
		}
	}
}

inline bool eval()
{
	bool rez;

	rez = termen();
	for( ; *p == ' ' && *p ; ++p );

	while( *p && *p != ')' )
	{
		char op[10] = {0};

		for( ; isalpha( *p ) && *p ; op[strlen(op)] = *p, p++ );
		for( ; *p == ' ' && *p ; ++p );

		if( !strcmp( op, "AND" ) ) rez &= termen();
		else if( !strcmp( op, "OR" ) ) rez |= termen();
	}

	return rez;
}

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

	gets(S);
	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", (int)(eval()) );
	}
	printf("\n");

	return 0;
}