Cod sursa(job #351527)

Utilizator ilincaSorescu Ilinca ilinca Data 28 septembrie 2009 13:25:41
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <stdio.h>

#define pmax 1005
#define nmax 105

int n;
bool v [55];
char a [nmax], *p;


inline bool conditie ()
{
	if (*p  == 'A' && *(p+1) == 'N')
		return true;
	if (*p == 'O' && *(p+1) == 'R')
		return true;
	return false;
}

inline bool negare ()
{
	if (*p != 'N')
		return false;
	if (*(p+1) != 'O')
		return false;
	p += 4;
	return true;
}

bool eval ();

inline bool True ()
{
	if (*p == 'T' && *(p+1) == 'R')
	{
		p += 5;
		return true;
		
	}
	return false;
}

inline bool False ()
{
	if (*p == 'F' && *(p+1) == 'A')
	{
		p += 6;
		return true;
	}
	return false;
}

bool termen ()
{
	bool Not=negare (), r;
	if (True ())
		r=true;
	else
	{
		if (False ())
			r=false;
		else
		{
			if (*p == '(')
			{
				++p;
				r=eval ();
				p += 2;
			}
			else
			{
				r=v [*p-'A'];
				p += 2;
			}
		}
	}
		if (Not)
			return ~r;
		return r;
}

bool eval ()
{
	bool r=termen ();
	while (conditie ())
	{	
		if ((*p == 'A') && (*(p+1) == 'N'))
		{
			p += 4;
			r &= termen ();
		}    
		else
			if ((*p == 'O') && (*(p+1) == 'R'))
			{
				p += 3;
				r |= termen ();
			}
	}
	return r;
}

int main ()
{
	freopen ("bool.in", "r", stdin);
	freopen ("bool.out", "w", stdout);
	gets (a);
	scanf ("%d ", &n);
	int i;
	char c;
	for (i=1; i <= n; ++i)
	{
		scanf ("%c", &c);
		if (v [c-'A'] == true)
			v [c-'A']=false;
		else
			v [c-'A']=true;
		p=a;
		if (eval () == true)
			printf ("1");
		else
			printf ("0");
	}
	printf ("\n");
	return 0;
}