Cod sursa(job #64804)

Utilizator risenshineAkil Nasser risenshine Data 5 iunie 2007 18:49:16
Problema Bool Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#include <string.h>
#define NMAX 101
#define LMAX 1001

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

int evalp();
int eval();

int main() {
	int j;
	char c;
	freopen("bool.in", "r", stdin);
	fgets(e, LMAX, stdin);
	for (j = 0; e[j] != '\n'; ++j)
		;
	e[j] = NULL;
	scanf("%d\n", &N);
	for (j = 0; j < N; ++j) {
		scanf("%c", &c);
		i = 0, v[c - 'A'] = !v[c - 'A'];
		//printf(" %d ", c - 'A');
		printf("%d", evalp());
	}
	return 0;
}

int eval() {
	if (e[i] == 'N' && e[i+1] == 'O') {
		i += 4;
		return !eval();
	}
	else if (e[i] == '(') {
		++i;
		return evalp();
	}
	else if (e[i] == 'T' && e[i+1] == 'R') {
		i += 5;
		return 1;
	}
	else if (e[i] == 'F' && e[i+1] == 'A') {
		i += 6;
		return 0;
	}
	else if (e[i] >= 'A' && e[i] <= 'Z') {
		i += 2;
		return v[e[i] - 'A'];
	}
}
int evalp() {
	int e1, e2;
	e1 = eval();
	//printf("e1 %d\n", e1);
	//printf("i %d e[i] %c\n", i, e[i]);
	if (e[i] == 'A' && e[i+1] == 'N') {
		//printf("i %d\n", i);
		i += 4;
		e2 = eval();
		i += 1;
		return e1 && e2;
	}
	else if (e[i] == 'O' && e[i+1] == 'R') {
		//printf("i %d e[i] %c\n", i, e[i]);
		i += 3;
		e2 = eval();
		//printf("%d ", e2);
		i += 1;
		return e1 || e2;
	}
	else {
		//printf("%d ", i);
		i += 1;
		return e1;
	}
}