Pagini recente » Cod sursa (job #298551) | Cod sursa (job #2434431) | Cod sursa (job #728498) | Cod sursa (job #401774) | Cod sursa (job #2311444)
#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();
}