Cod sursa(job #2311444)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 3 ianuarie 2019 11:27:41
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");

istream & in = fin;
ostream & out = fout;

string ass = "A AND ((B OR NOT C) OR ((TRUE)))";
bool vars[41];

bool NotToken(char a)
{
	return (a == '(' || a == ')' || a == ' ');
}

void Transform()
{
	string newass = "", tok = "";
	for(char & c : ass){
		if(!NotToken(c)){
			tok += c;
		}else{
			if(tok == "NOT"){
				newass += "!";
			}else if(tok == "AND"){
				newass += "&";
			}else if(tok == "OR"){
				newass += "|";
			}else if(tok == "TRUE"){
				newass += "1";
			}else if(tok == "FALSE"){
				newass += "0";
			}else{
				newass += tok;
			}
			if(c != ' '){
				newass += c;
			}
			tok = "";
		}
	}
	ass = newass;
}

int GetPriority(char c)
{
	if(c == '|'){
		return 0;
	}else if(c == '&'){
		return 1;
	}else if(c == '!'){
		return 2;
	}
	return 3;
}

bool Eval(int lt = 0, int rt = ass.size())
{
	int depth = 0;
	int pry, pos = -1;
	char op;
	char c;
	for(int i = lt; i < rt; i++){
		c = ass[i];
		if(c == '('){
			depth++;
		}else if(c == ')'){
			depth--;
		}
		if(depth == 0 && !NotToken(c) && (pos == -1 || GetPriority(c) < pry)){
			pry = GetPriority(c);
			pos = i;
			op = c;
		}
	}
	if(pos == -1){
		return Eval(lt+1, rt-1);
	}
	if(op == '|'){
		return Eval(lt, pos) || Eval(pos+1, rt);
	}else if(op == '&'){
		return Eval(lt, pos) && Eval(pos+1, rt);
	}else if(op == '!'){
		return !Eval(pos+1, rt);
	}else{
		return vars[int(op-'A')];
	}
}

int n;
void Read()
{
	getline(in, ass);
	in >> n;
}

void SolveWrite()
{
	Transform();
	char c;
	int var;
	for(int i = 0; i < n; i++){
		in >> c;
		var = int(c-'A');
		vars[var] = !vars[var];
		out << Eval();
	}
}

int main()
{
	Read();
	SolveWrite();
}