Pagini recente » Cod sursa (job #761366) | Cod sursa (job #793609) | Cod sursa (job #1697746) | Istoria paginii utilizator/marinel_serban | Cod sursa (job #2076430)
#include <bits/stdc++.h>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
int N, M, i, sz, p, val[34];
char c, st[1104], s[1104];
int eval_and();
int eval_or();
int eval_not();
int eval() {
int res;
if(s[p] == 't') {
++p;
return 1;
} else if(s[p] == 'f') {
++p;
return 0;
} else if(s[p] >= 'A' && s[p] <= 'Z') {
++p;
res = val[s[p - 1] - 'A'];
} else if(s[p] == '(') {
++p;
res = eval_or();
++p;
}
return res;
}
int eval_or() {
int res = eval_and();
while(s[p] == '|' && p < sz) {
++p;
res = res | eval_and();
}
return res;
}
int eval_and() {
int res = eval_not();
while(s[p] == '&' && p < sz) {
++p;
res = res & eval_not();
}
return res;
}
int eval_not() {
if(s[p] == '!') {
++p;
return !eval_not();
}
return eval();
}
int main() {
f.getline(st,1010);
N=strlen(st);
for(int i = 0; i < N;) {
if(st[i] == 'A' && st[i + 1] == 'N')
s[++sz] = '&', i += 3;
else if(st[i] == 'O' && st[i + 1] == 'R')
s[++sz] = '|', i += 2;
else if(st[i] == 'N' && st[i + 1] == 'O')
s[++sz] = '!', i += 3;
else if(st[i] == 'T' && st[i + 1] == 'R')
s[++sz] = 't', i += 4;
else if(st[i] == 'F' && st[i + 1] == 'A')
s[++sz] = 'f', i += 5;
else {
if(st[i] <= 'Z' && st[i] >= 'A' || st[i] == '(' || st[i] == ')')
s[++sz] = st[i];
i++;
}
}
f >> M;
while(M--) {
f >> c;
val[c - 'A'] ^= 1;
p = 1;
g << eval_or();
}
return 0;
}