Cod sursa(job #865438)

Utilizator matei_cChristescu Matei matei_c Data 26 ianuarie 2013 15:03:09
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std ;

#define maxsir 1010
#define maxn 110

char sir[maxsir] ;
char *p ;

int n ;
int val[maxn] ;

int evaluare() ;
int termen() ;
int factor() ;
 
int evaluare()
{
	int rez = termen() ;
	
	while( *p == 'O' && *( p + 1 ) == 'R' )
	{
		p += 3 ;
		rez |= termen() ;
	}
	
	return rez ;
}
 
 
int termen()
{
	int rez = factor() ;
	
	while( *p == 'A' && *( p + 1 ) == 'N' && *( p + 3 ) == 'D' )
    {
		p += 4 ;
		rez &= factor() ;
    }
    
	return rez ;
}
 
int factor()
{
	int rez = 0 ;
	 
	if( *p == 'N' && *( p + 1 ) == 'O' && *( p + 2 ) == 'T' ) 
	{
		p += 4 ;
		rez |= ! factor() ;
	}
	else
	{	
		if( *p == 'T' && *( p + 1 ) == 'R' && *( p + 2 ) == 'U' && *( p + 3 ) == 'E' )
		{
			p += 5 ;
			rez = 1 ;
		}
		else
		{	
			if( *p == 'F' && *( p + 1 ) == 'A' && *( p + 2 ) == 'L' && *( p + 3 ) == 'S' && *( p + 4 ) == 'E' )
			{	
				p += 6 ;
				rez = 0 ; 
			}
			else
			{	
				if( *p == '(' )
				{
					++p ;
					rez = evaluare() ;
					++p ;
				}	
				else
				{
					rez = val[ *p - 'A' ] ;
					p += 2 ;
				}
			}
		}
	}
	
	return rez ;	
}
 
int main()
{
    
	freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    
    gets( sir ) ;
	
    scanf("%d\n", &n);
    
	for(int i = 1; i <= n; ++i )
    {
		char ch ;
		
		scanf("%c", &ch);
		
		val[ ch - 'A' ] = ! val[ ch - 'A' ] ;
		
		p = sir ;
		
		printf("%d", evaluare() );
    }
	
    return 0 ;
	
}