Cod sursa(job #2662929)

Utilizator marquiswarrenMajor Marquis Warren marquiswarren Data 24 octombrie 2020 20:48:03
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 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 (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);
	
	getchar();
	for (int i = 0 ; i < n; i++) {
		char c = getchar();
		values[c - 'A'] = !values[c - 'A'];
		printf("%d", eval(root));
	}

	return 0;
}