Pagini recente » Cod sursa (job #805401) | Cod sursa (job #275756) | Cod sursa (job #1671690) | Cod sursa (job #1097916) | Cod sursa (job #2662926)
#include <bits/stdc++.h>
const int LMAX = 1005;
const int NMAX = 105;
int n;
char s[LMAX];
bool values[26];
enum Operation { NONE, NOT, AND, OR };
struct Node {
Node *left{nullptr}, *right{nullptr};
bool value{false};
Operation op{NONE};
char symbol{0};
};
Node* build(int left, int right) {
int brackets = 0;
for (int i = right; i >= left; i--) {
if (s[i] == ')')
brackets++;
else if (s[i] == '(')
brackets--;
else if (!brackets) {
if (strstr(s + i, "AND") == s + i) {
Node *node = new Node;
node->op = AND;
node->left = build(left, i - 2);
node->right = build(i + 4, right);
return node;
}
if (strstr(s + i, "OR") == s + i) {
Node *node = new Node;
node->op = OR;
node->left = build(left, i - 2);
node->right = build(i + 3, right);
return node;
}
}
}
if (s[left] == '(')
return build(left + 1, right - 1);
Node *node = new Node;
char aux = 0;
std::swap(s[right + 1], aux);
if (strcmp(s + left, "TRUE") == 0) {
node->value = true;
} else if (strcmp(s + left, "FALSE") == 0) {
node->value = false;
} else if (strstr(s + left, "NOT") == s + left) {
node->op = NOT;
node->left = build(left + 4, right);
} else{
node->symbol = s[left];
}
std::swap(s[right + 1], aux);
return node;
}
bool eval(Node* node) {
if (node->op == NONE) {
if (!node->symbol)
return node->value;
return values[node->symbol - 'A'];
}
if (node->op == NOT)
return !eval(node->left);
if (node->op == AND)
return eval(node->left) && eval(node ->right);
if (node->op == OR)
return eval(node->left) || eval(node ->right);
return false;
}
int main() {
freopen("bool.in", "r", stdin);
freopen("bool.out", "w", stdout);
fgets(s, LMAX, stdin);
scanf("%d", &n);
Node* root = build(0, strlen(s) - 2);
for (int i = 0 ; i < n; i++) {
char c;
scanf("%c", &c);
values[c - 'A'] ^= 1;
printf("%d", eval(root));
}
return 0;
}