Cod sursa(job #2662934)

Utilizator marquiswarrenMajor Marquis Warren marquiswarren Data 24 octombrie 2020 21:11:28
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 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{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 (strncmp(s + i, "AND", 3) == 0) {
                Node *node = new Node;
                node->op = AND;
                node->left = build(left, i - 2);
                node->right = build(i + 4, right);
                return node;
            }

            if (strncmp(s + i, "OR", 2) == 0) {
                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;

    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;
}