Cod sursa(job #36764)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 24 martie 2007 00:09:19
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include <cstring>
#define FIN "bool.in"
#define FOUT "bool.out"

char buf[2000], e[1000];
bool A['z'-'a'+2];
long i, n;

void parse() {
	long n=0;
	for (i=0, n=0; buf[i]!='\n'; ++i)
		if ( buf[i] != ' ' ) 
			e[n++] = buf[i];
}

bool ev();

int main() {
	char c;
	freopen(FIN, "r", stdin);
	freopen(FOUT, "w", stdout);

	fgets(buf, 2000, stdin);
	parse();
//	fprintf(stderr,"%s",e);

	for (i=0; i<'z'-'a'+1; ++i)
		A[i] = false;

	scanf("%ld\n", &n);
	while ( n-- ) {
		scanf("%c", &c);
		A[c-'A'] = !A[c-'A'];
		i = 0;
		printf("%d", (ev()) ? 1 : 0);
	}
	printf("\n");
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}

bool op1(); // pt and
bool op2(); // pt not

bool ev() { // pt or
	bool ret = op1();
	while ( strncmp(e+i, "OR", 2)==0 ) {
		i+=2;
		ret |= op1();
	}
	return ret;
}

bool op1() {
	bool ret = op2();
	while ( strncmp(e+i,"AND", 3)==0 ) {
		i+=3;
		ret &= op2();
	}
	return ret;
}

bool op2() {
	bool ret;
	if ( strncmp(e+i,"NOT", 3)==0 ) {
		i+=3;
		ret =  ! op2();
	}
	else {
		if ( e[i] == '(' ) {
			++i;
			ret =  ev();
			++i;
		}
		else {
			ret = A[e[i]-'A'];
			i++;
		}
	}
	return ret;
}