Cod sursa(job #352163)

Utilizator ilincaSorescu Ilinca ilinca Data 30 septembrie 2009 16:53:16
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 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;
		++p;
	}
	if (*p == '(')
	{
		++p;
		r=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)
	{
		if (r)
			r=false;
		else
			r=true;
	}
	return r;
}

bool eval ()
{
	bool r=termen ();
	while (*p == '&' || *p == '|')
	{
		++p;
		if (*(p-1) == '&')
		{
			if (termen () == false || r == false)
				r=false;
			else
				r=true;
		}
		else
		{
			if (termen () == true || r == true)
				r=true;
			else 
				r=false;
		}
	}
	//printf("%s %d\n",q,r);
	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;
	//printf ("%s\n", b);
	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;
}