Cod sursa(job #136538)

Utilizator scvalexAlexandru Scvortov scvalex Data 15 februarie 2008 17:38:02
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

char exp[1002];
bool vars[26];
int pos;

bool getVar() {
	//cout << "Processing variable " << exp[pos] << endl;
	bool a = vars[exp[pos] - 'A'];
	pos += 2;
	return a;
}

// exp ::= 'TRUE' | 'FALSE' | '(' exp ')' | 'NOT' exp | exp 'AND' exp | exp 'OR' exp
bool eval() {
	if (strstr(exp + pos, "TRUE") == exp + pos) {
		//cout << "Found TRUE" << endl;
		pos += 4;
		return true;
	}
	if (strstr(exp + pos, "FALSE") == exp + pos) {
		//cout << "Found FALSE" << endl;
		pos += 5;
		return false;
	}

	if (strstr(exp + pos, "NOT") == exp + pos) {
		//cout << "Processing NOT at " << pos << endl;
		pos += 4;
		return !eval();
	}

	bool a;
	if (exp[pos] == '(') {
		++pos;
		a = eval();
		++pos;
	} else
		a = getVar();

	if (strstr(exp + pos, "AND") == exp + pos) {
		//cout << "Processing AND at " << pos << endl;
		pos += 4;
		bool b = eval();
		return a && b;
	}

	if (strstr(exp + pos, "OR") == exp + pos) {
		//cout << "Processing OR at " << pos << endl;
		pos += 3;
		bool b = eval();
		return a || b;
	}

	return a;
}

int main(int argc, char *argv[]) {
	ifstream fin("bool.in");	
	fin.getline(exp, 1001);
	//cout << exp << endl;
	int N;
	fin >> N;
	char c;
	ofstream fout("bool.out");
	while (N--) {
		fin >> c;
		vars[c - 'A'] = !vars[c - 'A'];
		pos = 0;
//		for (int i(0); i < 26; ++i)
//			cout << vars[i];
//		cout << endl;
		fout << eval();
	}
	fout << endl;
	fout.close();
	fin.close();

	return 0;
}