Cod sursa(job #65169)

Utilizator risenshineAkil Nasser risenshine Data 7 iunie 2007 13:36:15
Problema Bool Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <string.h>
#define NMAX 1001

char e[NMAX];
int N, k, v['Z'-'A'+1];

int evalf();
int evalt();
int evale();

int main() {
	int i;
	char c;
	freopen("bool.in", "r", stdin);
	freopen("bool.out", "w", stdout);
	fgets(e, NMAX, stdin);
	//printf("%d ", strlen(e));
	scanf("%d\n", &N);
	for (i = 0; i < N; ++i) {
		scanf("%c", &c);
		k = 0, v[c-'A'] = !v[c-'A'];
		printf("%d", evale());
	}
	//printf("%d ", evale());
	//printf("%d", k);
	return 0;
}

int evalf() {
	if (e[k] == '(') {
		++k;
		return evale();
	}
	else if (e[k] == 'N' && e[k+1] == 'O') {
		k += 4;
		return !evalf();
	}
	else if (e[k] == 'T' && e[k+1] == 'R') {
		k += 4;
		if (e[k] == ' ')
			++k;
		return 1;
	}
	else if (e[k] == 'F' && e[k+1] == 'A') {
		k += 5;
		if (e[k] == ' ')
			++k;
		return 0;
	}
	else {
		int r = v[e[k]-'A'];
		++k;
		if (e[k] == ' ')
			++k;
		return r;
	}
}
int evalt() {
	int r = evalf();
	while (e[k] == 'A' && e[k+1] == 'N') {
		k += 4;
		r &= evalf();
	}
	return r;
}
int evale() {
	int r = evalt();
	while (e[k] == 'O' && e[k+1] == 'R' && e[k] && e[k] != ')') {
		k += 3;
		r |= evalt();
	}
	++k;
	if (e[k] == ' ')
		++k;
	//printf("%d %d %c\n", k, r, e[k]);
	return r;
}