Cod sursa(job #2664181)

Utilizator marquiswarrenMajor Marquis Warren marquiswarren Data 28 octombrie 2020 08:16:52
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#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{0}, *right{0};
    Operation op{NONE};
    bool value{false};
    char symbol{0};
};
 
Node* build(int left, int right) {
    int brackets = 0;

	for (const auto& op : { "OR", "AND" }) {
		for (int i = right; i >= left; i--) {
			if (s[i] == ')')
				brackets++;

			else if (s[i] == '(')
				brackets--;

			else if (!brackets) {
				if (strncmp(s + i, op, strlen(op)) == 0) {
					Node *node = new Node;
					node->op = *op == 'O' ? OR : AND;
					node->left = build(left, i - 2);
					node->right = build(i + strlen(op) + 1, right);
					return node;
				}
			}
		}
	}
 
    if (s[left] == '(')
        return build(left + 1, right - 1);
 
    Node *node = new Node;
 
    if (strncmp(s + left, "TRUE", 4) == 0) {
        node->value = true;
    } else if (strncmp(s + left, "FALSE", 5) == 0) {
        node->value = false;
    } else if (strncmp(s + left, "NOT", 3) == 0) {
        node->op = NOT;
        node->left = build(left + 4, right);
    } else{
        node->symbol = s[left];
    }
 
    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);
 
    getchar();
    for (int i = 0 ; i < n; i++) {
        char c = getchar();
        values[c - 'A'] ^= 1;
        printf("%d", eval(root));
    }
 
    return 0;
}