Cod sursa(job #199792)

Utilizator tvladTataranu Vlad tvlad Data 20 iulie 2008 16:36:15
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <cstring>

const int E = 2000;
const int N = 200;

char exp[E+1], var[N+1], *ev;
int n, en;
bool v['Z'-'A'+1];

int termen();
int factor();

int eval() {
	int t = termen();
	for (; *ev == 'O' && *(ev+1) == 'R'; ev += 2, t |= termen());
	return t;
} 

int termen() {
	int f = factor();
	for (; *ev == 'A' && *(ev+1) == 'N'; ev += 3, f &= factor());
	return f;
}

int factor() {
	int r, niet = false;
	if (*ev == 'N' && *(ev+1) == 'O') {
		ev += 3;
		niet = true;
		r = factor();
	} else
	if (*ev == '(') {
		++ev;
		r = eval();
		++ev;
	} else
	if (*ev == 'T' && *(ev+1) == 'R') {
		ev += 4;
		r = true;
	} else
	if (*ev == 'F' && *(ev+1) == 'A') {
		ev += 5;
		r = false;
	} else {
		r = v[*ev - 'A'];
		++ev;
	}
	return (niet) ? !r : r;
}

int main() {
	freopen("bool.in","rt",stdin);
	freopen("bool.out","wt",stdout);
	fgets(exp,E,stdin);
	en = strlen(exp);
	int p = 0;
	for (int i = 0; i < en; ++i)
		if (exp[i] != ' ') exp[p++] = exp[i];
	exp[p] = '\0';
	scanf("%d\n",&n);
	fgets(var,N,stdin);
	for (int i = 0; i < n; ++i) {
		v[var[i]-'A'] = !v[var[i]-'A'];
		ev = exp;
		printf("%d",eval());
	}
	printf("\n");
	return 0;
}