Cod sursa(job #396447)

Utilizator ilincaSorescu Ilinca ilinca Data 15 februarie 2010 13:14:32
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h> 

#define lmax 1005

char s [lmax], sp [lmax], *p;
int v [35];



inline bool lit (char c)
{
	if (c >= 'A' && c <= 'Z') 
		return true;
	return false;
}

void ceva ()
{
	int i, k=-1;
	for (i=0; s [i] ; ++i)
	{
		if (s [i] == ' ') continue;
	       	if ((lit (s [i]) && (!lit (s [i+1]))) || (s [i] == '(') || (s [i] == ')')) 
			{ sp [++k]=s [i]; continue; }
		if (s [i] == 'A')
		{
			sp [++k]='&';
			i+=2;
			continue;
		}	
		if (s [i] == 'O') 
		{
			sp [++k]='|';
			++i;
			continue;
		}
		if (s [i] == 'N') 
		{
			sp [++k]='~';
			i+=2;
			continue;
		}
		if (s [i] == 'T') 
		{
			sp [++k]='1';
			i+=3;
			continue;
		}
		if (s [i] == 'F') 
		{
			sp [++k]='0';
			i+=4;
		}
		sp [++k]=0;
	}	
}

int eval ();

int termen ()
{
	int r, neg=0;
	while (*p == '~')
	{	
		neg=1-neg;
		++p;
	}
	if (*p == '(')
	{
		r=eval ();	
		++p;
	}
	else
	{
		//fprintf(stderr, "%c %d\n", *p, v [(*p)-'A']);  
		if (*p == '1') 
			r=1;
		if (*p == '0') 
			r=0;
		if (lit (*p))
		       r=v [(*p)-'A'];	
		++p;
	}
	if (neg) 
	{
		if (r)
			r=0;	
		else
			r=1;
	}
	return r;
}

int eval ()
{
	int r=termen ();
	//fprintf(stderr, "%d %s\n", r,p ); 
	while (*p == '|' || *p == '&')
	{
		if (*p == '|')
		       r |= termen ();	
		else
		 	r &= termen ();
		++p;
	}	
	return r;
}

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