Cod sursa(job #907621)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 8 martie 2013 09:24:55
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <stdio.h>
#include <assert.h>
using namespace std;

FILE *fi = fopen ("bool.in", "r");
FILE *fo = fopen ("bool.out", "w");

const int dim = 1003;
char F[dim], E[dim], M[dim], *P;
int N;

int foor ();
int fand ();
int fxor ();
int fpar ();

void citire ()
{
	int k = -1;
	char aux[dim];
	
	fgets (E, dim, fi);
	fscanf (fi, "\n%d\n", &N);
	fgets (M, dim, fi);
	
	for (int i = 0; E[i]; i++)
	{
		if (E[i] == ' ')
			continue;
		aux[++k] = E[i];
		
		if (E[i] == 'A' && E[i+1] == 'N' && E[i+2] == 'D')
			aux[k] = '&', i += 2;
		else if (E[i] == 'O' && E[i+1] == 'R')
			aux[k] = '|', i += 1;
		else if (E[i] == 'N' && E[i+1] == 'O' && E[i+2] == 'T')
			aux[k] = '1', aux[++k] = '^', i += 2;
		else if (E[i] == 'T' && E[i+1] == 'R' && E[i+2] == 'U' && E[i+3] == 'E')
			aux[k] = '1', i += 3;
		else if (E[i] == 'F' && E[i+1] == 'A' && E[i+2] == 'L' && E[i+3] == 'S' && E[i+4] == 'E')
			aux[k] = '0', i += 4;
	}
	
	for (int i = 0; i <= k; i++)
		E[i] = aux[i];
	E[k + 1] = 0;
}

int foor ()
{
	int r = fand ();
	while (*P == '|')
	{
		P++;
		r |= fand ();
	}
	return r;
}


int fand ()
{
	int r = fxor ();
	while (*P == '&')
	{
		P++;
		r &= fxor ();
	}
	return r;
}

int fxor ()
{
	int r = fpar ();
	while (*P == '^')
	{
		P++;
		r ^= fpar ();
	}
	return r;
}

int fpar ()
{
	int r = 0;
	if (*P == '(')
	{
		P++;
		r = foor ();
	}
	else if (*P == '0' || *P == '1')
	{
		r = *P - '0';
	}
	else if (*P >= 'A' && *P <= 'Z')
	{
		r = F[*P];
	}
	else
		assert (0);
	P++;
	return r;
}

int main ()
{
	citire ();
	for (int i = 0; i < N; i++)
	{
		F[M[i]] ^= 1;
		P = E;
		fprintf (fo, "%d", foor ());
	}
	//printf ("\n%s", E);
	
	return 0;	
}