Cod sursa(job #301718)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 8 aprilie 2009 13:25:30
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <cstring>

#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define IN  "bool.in"
#define OUT "bool.out"

int N,hmax = 3;
char *p,A[1<<10],S[1<<10];
char V[1<<10];

void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	fgets(A,1<<10,stdin);
	scanf("%d\n",&N);
	fgets(S,1<<10,stdin);
}

int operatie(bool a,bool b,char c)
{
	switch(c) 
	{
		case '&' : return a & b;
		case '|' : return a | b;
		case '!' : return !a;	
	}		
	return 0;
}

int eval(int);

int element()
{
	int r=0;  
	if ( *p == '(' )
	{  
	    ++p;
		r = eval(0);
		++p;  
	}
	else
	{  
	    if(*p >= 'A' && *p <= 'Z')  
	        r = V[(int)*p],++p;  
	}  
	return r;  
}

int eval(int h)
{
	int r = (h==hmax)?element():eval(h+1);  
  
	while(strchr("&!|", *p) )   
        r = operatie(r, eval(h+1), *(++p-1));  
    return r;  
}

void solve()
{
	int j(-1);
	for(int i=A[0];A[i] != '\n' && A[i] != '\0';++i)
	{
		if(A[i] == 'A' && A[i+1] == 'N')
		{
			A[++j] = '&';
			i += 2;
			continue;
		}
		if(A[i] == 'O' && A[i+1] == 'R')
		{
			A[++j] = '|';
			i += 1;
			continue;
		}	
		if(A[i] == 'N' && A[i+1] == 'O')
		{
			A[++j] = '!';
			i += 2;
			continue;
		}
		A[++j] = A[i];
	}
	
	FOR(i,0,N-1)
	{
		p = A;
		V[ (int)S[i] ] = !V[ (int)S[i] ];
		printf("%d",eval(0) );
	}	
}

int main()
{
	scan();
	solve();
	return 0;
}