Cod sursa(job #352173)

Utilizator ilincaSorescu Ilinca ilinca Data 30 septembrie 2009 17:06:30
Problema Bool Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 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;
	}
	else
	{
		if (*p == 't')
	//{
	//	++p;
			r=true;
	//}	
		if (*p == 'f')
	//{
	//	++p;
			r=false;
	//}
		if (*p >= 'A' && *p <= 'Z')
	//{
	//	++p;
			r=v [*p-'A'];
	//}
		++p;
	}
	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;
}