Cod sursa(job #532425)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 11 februarie 2011 16:34:43
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
using namespace std;

const int NMAX = 102, LEMAX = 1002;

ifstream fi ("bool.in");
ofstream fo ("bool.out");

int N;
char S[LEMAX], T[NMAX], *P, *Q, L[26];

void citire (), afisare ();
int eval (), op_or (), op_and (), op_not ();

int eval ()
{
	int n = op_or ();
	while (*P == '|')
	{
		P++;
		n |= op_or ();
	}
	return n;
}

int op_or ()
{
	int n = op_and ();
	while (*P == '&')
	{
		P++;
		n &= op_and ();
	}
	return n;
}

int op_and ()
{
	int n = op_not ();
	while (*P == '^')
	{
		P++;
		n ^= op_not ();
	}
	return n;
}

int op_not ()
{
	int n;
	if (*P == '(')
	{
		P++;
		n = eval ();
		P++;
	}
	else 
	{
		if (*P >= 'A' && *P <= 'Z')
			n = L[*P - 'A'];
		else
			n = *P;
		P++;
	}
	return n;
}

void citire ()
{
	fi.getline (S, LEMAX);
	fi >> N;
	fi >> T;
	for (P = Q = S; *P; P++)
	{
		if (*P == 'N' && *(P+1) == 'O' && *(P+2) == 'T')
			*Q++ = 1, *Q++ = '^', P += 2;		
		else if (*P == 'A' && *(P+1) == 'N' && *(P+2) == 'D')
			*Q++ = '&', P += 2;
		else if (*P == 'O' && *(P+1) == 'R')
			*Q++ = '|', P += 1;
		else if (*P == 'T' && *(P+1) == 'R' && *(P+2) == 'U' && *(P+3) == 'E')
			*Q++ = 1, P += 3;		
		else if (*P == 'F' && *(P+1) == 'A' && *(P+2) == 'L' && *(P+3) == 'S' && *(P+4) == 'E')
			*Q++ = 0, P += 4;		
		else if (*P >= 'A' && *P <= 'Z' || *P == '(' || *P == ')')
			*Q++ = *P;		
	}
	*Q = 0;
}

void afisare ()
{
	for (int i = 0; i < N; ++i)
	{
		P = S;
		L[T[i] - 'A'] ^= 1;
		fo << eval ();		
	}
}

int main ()
{
	citire ();
	afisare ();

	return 0;
}