Cod sursa(job #80245)

Utilizator MariusMarius Stroe Marius Data 27 august 2007 00:42:01
Problema Bool Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <fstream>
#include <iostream>
#include <string.h>

using namespace std;

const char iname[] = "bool.in";
const char oname[] = "bool.out";

#define MAXL  1024

const char T[] = "TRUE";
const char F[] = "FALSE";
const char AND[] = "AND";
const char NOT[] = "NOT";
const char OR[]  = "OR";

int V[256];


int f(char O[], int cnt)
{
	int S[MAXL], cnts = 0;

	for (int i = 0; i < cnt; ++ i) {
		if (('A' <= O[i]) && (O[i] <= 'Z'))
			S[cnts ++] = V[O[i]];
		else if ((O[i] == '0') || (O[i] == '1'))
			S[cnts ++] = O[i] - '0';
		else if (O[i] == '!')
			S[cnts - 1] ^= 1;
		else if (O[i] == '&')
			S[cnts - 2] = S[cnts - 2] & S[cnts - 1], cnts --;
		else if (O[i] == '|')		
			S[cnts - 2] = S[cnts - 2] | S[cnts - 1], cnts --;
//		for (int j = 0; j < cnts; ++ j)
//			printf("%d", S[j]);
//		printf("\n");
	}
	return S[0];
}

int Op(char E[], int i, int len)
{
	if ((i + 3 < len) && (strncmp(E + i, OR, 2) == 0))
		return 1;
	if ((i + 4 < len) && (strncmp(E + i, AND, 3) == 0))
		return 2;
	if ((i + 4 < len) && (strncmp(E + i, NOT, 3) == 0))
		return 3;
	
	return 0;
}

int Const(char E[], int i, int len)
{
	if ((i + 4 < len) && (strncmp(E + i, T, 4) == 0))
		return 1;
	if ((i + 5 < len) && (strncmp(E + i, F, 5) == 0))
		return 0;
	return -1;
}

int main(void)
{
	char E[MAXL], S[MAXL], O[MAXL], ch;
	int n;

	int cnts, cnto, i, len;

	ifstream fin(iname);

	fin.getline(E, MAXL);

	len = int(strlen(E));
	for (i = len; i > 0; -- i) {
		E[i] = E[i - 1];
	}
	E[0] = '(', E[++ len] = ')', E[++ len] = 0;

    for (cnts = cnto = i = 0; i < len; ++ i) {
		if (E[i] == ' ') {
	//		printf("spatiu\n");
			continue ;
		} else if (E[i] == '(') {
			S[cnts ++] = '(';
	//		printf("(\n");
		} else if (Op(E, i, len)) {
			int pr = Op(E, i, len);
	//		printf("prioritate %d\n", pr);
			if (pr == 1)
				S[cnts ++] = '|', i += 1;
			else if (pr == 2)
				S[cnts ++] = '&', i += 2;
			else if (pr == 3)
				S[cnts ++] = '!', i += 2;
		} else if (Const(E, i, len) != -1) {
	//		printf("operator const %d\n", Const(E, i, len));
			int cnst = Const(E, i, len);
			O[cnto ++] = cnst + '0';
			if (cnst == 0)
				i += 4;
			else
				i += 3;
		} else if (E[i] == ')') {
	//		printf(")\n");
			while (S[cnts - 1] != '(')
				O[cnto ++] = S[-- cnts];
			cnts --;
		} else {
	//		printf("operand %c\n", E[i]);
			O[cnto ++] = E[i];
		}
		S[cnts] = 0, O[cnto] = 0;
	}
	O[cnto] = 0;
//	printf("%s\n", O);

	ofstream fout(oname);
	
	for (fin >> n; n > 0; -- n) {
		fin >> ch;
		V[ch] ^= 1;
		fout << f(O, cnto);
	}

	fin.close();
	fout.close();
	return 0;
}