Cod sursa(job #529979)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 6 februarie 2011 17:07:23
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<stdio.h>
#include<string.h>
#define Nmax 1010
using namespace std;

int poz[30][Nmax],i,j,n,k,c ;
char expr[Nmax], a[Nmax], x, *p ; 

int termen();
int factor();

int eval()
{
	int r = termen();
	
	while( *p == '|' )
		++p, r |= termen() ;
	
	return r ;
}

int termen()
{
	int r = factor();
	
	while( *p == '&' ) 
		++p, r &= factor();
	
	return r ;
}

int factor()
{
	int r = 1 ;
	
	if( *p == '!' )
	{
		++p ; r = factor() ^ 1 ;
	}
	else if( *p == '(' ) 
	{
		++p ; r = eval() ; ++p ; 
	}
	else
	{
		r = *p - '0' ; ++p ;
	}
	
	return r ; 
}


int main()
{
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	
	fgets(a,Nmax-5,stdin);
	
	n = strlen(a);
	
	for( i = 0 ; i < n ; i++ )
	{
		if( a[i] >= 'A' && a[i] <= 'Z' )
		{
			if( a[i+1] < 'A' || a[i+1] > 'Z' )
			{
				expr[++k] = '0' ;
				c = a[i] - 'A' + 1 ;
				
				poz[c][++poz[c][0]] = k ;
			}
			else
				if( a[i] == 'T' )
				{
					expr[++k] = '1' ;
					i += 3 ;
				}
				else if ( a[i] == 'F' )
				{
					expr[++k] = '0' ; 
					i += 4 ;
				}
				else if ( a[i] == 'A' )
				{
					expr[++k] = '&';
					i += 2 ;
				}
				else if ( a[i] == 'O' )
				{
					expr[++k] = '|' ;
					i++ ;
				}
				else if( a[i] == 'N' )
				{
					expr[++k] = '!' ;
					i += 2 ; 
				}
		}
		else if( a[i] == '(' || a[i] == ')' )
			expr[++k] = a[i];
	}
	
	scanf("%d\n",&n);
	
	for( j = 1 ; j <= n ; j++ )
	{
		scanf("%c",&x);
		
		p = expr+1 ;
		c = x - 'A' + 1 ; 
		
		for( i = 1; i <= poz[c][0] ; i++ )
			if(	expr[poz[c][i]] == '0' )
				expr[poz[c][i]] = '1' ;
			else
				expr[poz[c][i]] = '0' ;
		
		printf("%d",eval());
	}
	
	return 0;
}