Cod sursa(job #64917)

Utilizator risenshineAkil Nasser risenshine Data 6 iunie 2007 11:40:36
Problema Bool Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>
#include <assert.h>
#include <string.h>
#define NMAX 1001

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

int eval();
int evalp();

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

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