Cod sursa(job #351779)

Utilizator ilincaSorescu Ilinca ilinca Data 29 septembrie 2009 12:24:15
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <stdio.h>

#define nmax 105
#define pmax 1005 

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


void modif (char a [])
{
	int i, w=-1;
	for (i=0; a [i]; ++i)
	{
		if (a [i] == ' ')
			continue;
		if (a [i] == 'T' && a [i+1] == 'R')
		{
			b [++w]='t';
			i += 3;
			continue;
		}
		if (a [i] == 'F' && a [i+1] == 'A')
		{
			b [++w]='f';
			i += 4;
			continue;
		}
		if (a [i] == 'A' && a [i+1] == 'N')
		{
			b [++w]='&';
			i += 2;
			continue;
		}
		if (a [i] == 'O' && a [i+1] == 'R')
		{
			b [++w]='|';
			i++;
			continue;
		}
		if (a [i] == 'N' && a [i+1] == 'O')
		{
			b [++w]='~';
			i += 2;
			continue;
		}
		b [++w]=a [i];
	}
	b [++w]=0;
}

bool eval ();

bool termen ()
{
	bool r, neg=false;
	if (*p == '~')
		neg=true;
	if (*p == '(')
	{
		++p;
		eval ();
		++p;
	}
	if (*p == 't')
	{
		++p;
		r=true;
	}		
	if (*p == 'f')
	{
		++p;
		r=false;
	}
	if (*p >= 'A' && *p <= 'Z')
		r=v [*p-'A'];
	if (neg)
		return ~r;
	return r;
}

bool eval ()
{
	bool r=termen ();
	while (*p == '&' || *p == '|')
	{
		++p;
		if (*(p-1) == '&')
			r &= termen ();
		else
			r |= termen ();
	}
	return r;
}

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