Pagini recente » Cod sursa (job #3322487) | Cod sursa (job #3314358) | Cod sursa (job #1722705) | Cod sursa (job #574270) | Cod sursa (job #3356025)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
vector<string> tokens;
int pos_tok = 0;
bool var_val[26];
bool expr();
bool factor() {
if(tokens[pos_tok] == "(") {
pos_tok++;
bool res = expr();
pos_tok++;
return res;
}
if(tokens[pos_tok] == "NOT") {
pos_tok++;
return !factor();
}
if(tokens[pos_tok] == "TRUE") {
pos_tok++;
return true;
}
if(tokens[pos_tok] == "FALSE") {
pos_tok++;
return false;
}
char v = tokens[pos_tok][0];
pos_tok++;
return var_val[v - 'A'];
}
bool term() {
bool res = factor();
while(pos_tok < tokens.size() && tokens[pos_tok] == "AND") {
pos_tok++;
bool nxt = factor();
res = res & nxt;
}
return res;
}
bool expr() {
bool res = term();
while(pos_tok < tokens.size() && tokens[pos_tok] == "OR") {
pos_tok++;
bool nxt = term();
res = res | nxt;
}
return res;
}
int main() {
string s;
while(getline(fin, s)) {
if(s.find_first_not_of(" \t\r\n") != string::npos) {
break;
}
}
int i = 0;
while(i < s.size()) {
if(s[i] == ' ' || s[i] == '\t' || s[i] == '\r' || s[i] == '\n') {
i++;
continue;
}
if(s[i] == '(' || s[i] == ')') {
tokens.push_back(string(1, s[i]));
i++;
} else if(s[i] >= 'A' && s[i] <= 'Z') {
string t = "";
while(i < s.size() && s[i] >= 'A' && s[i] <= 'Z') {
t += s[i];
i++;
}
tokens.push_back(t);
} else {
i++;
}
}
int n;
fin >> n;
string queries;
fin >> queries;
memset(var_val, 0, sizeof(var_val));
for(int j = 0; j < n; ++j) {
var_val[queries[j] - 'A'] ^= 1;
pos_tok = 0;
fout << expr();
}
fout << "\n";
fin.close();
fout.close();
return 0;
}