Cod sursa(job #199789)

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

const int E = 1000;
const int N = 100;

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

bool termen();  
bool factor();  

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

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

bool factor() {
	bool 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+1,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+1,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;
}