Cod sursa(job #907162)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 7 martie 2013 17:55:40
Problema Bool Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include<fstream>
#include<string.h>

using namespace std;

#define max_n 1010
#define max_l 50

ifstream f("bool.in");
ofstream g("bool.out");

char *p ;

char a[max_n] , expr[max_n] , V[max_l] ;
int k = -1 , lungime , n;
bool Val[max_l];

void read(){
	
	f.get(a , max_n);  
	lungime = strlen(a);
	
	for( int  i = 0 ; i < lungime ; i++ ){
		if( a[i] == ' ' )
			continue;
		if( a[i] == '(' || a[i] == ')' ){
			expr[++k] = a[i];
			continue;
		}
		
		if( a[i] == 'A' && a[i+1] == 'N' && a[i+2] == 'D' ){
			expr[++k] = '&';  i += 2;
			continue;
		}
		if( a[i] == 'N' && a[i+1] == 'O' && a[i+2] == 'T' ){
			expr[++k] = '!';  i += 2;
			continue;
		}
		if( a[i] == 'O' && a[i+1] == 'R' ){
			expr[++k] = '|'; i++;
			continue;
		}
		if( a[i] == 'T' && a[i+1] == 'R' && a[i+2] == 'U' && a[i+3] == 'E' ){
			expr[++k] = '1'; i += 3;
			continue;
		}
		if( a[i] == 'F' && a[i+1] == 'A' && a[i+2] == 'L' && a[i+3] == 'S' && a[i+4] == 'E' ){
			expr[++k] = '0'; i += 4;
			continue;
		}
		expr[++k] = a[i];
		
	}
	
	f>>n;
	
	f>>V;
	
}

int expresie();
int factor();
int termen();

void solve(){
	
	int i ;
	
	for( i = 0 ; i < n ; i++ ){
		
		Val[ V[i] - 'A' ] ^= 1;
		
		p = expr;
		
		g<<expresie();
		
	}
	
	
}


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

int expresie(){
	
	int rez = factor();
	
	while( (*p) == '|' ){
		
		p++;
		
		rez |= factor();
		
	}
	
	return rez;
	
}


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

int termen(){
	
	int rez;
	
	if( (*p) == '(' ){
		p++;
		rez = expresie();
		p++;
	}
	else{
		if( (*p) == '!' ){
			p++;
			rez = termen();
			rez ^= 1;
		}
		else{
			
			if( (*p) == '1' ){
				rez = 1;
				p++;
			}
			else{
				if( (*p) == '0' ){
					rez = 0;
					p++;
				}
				else{
					rez = Val[ (*p) - 'A' ];
					p++;
				}
			}
		}
	}
	return rez;
}