Cod sursa(job #249646)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 28 ianuarie 2009 21:37:24
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>
#include <math.h>

#define MAXN 1010

long v[MAXN], n, q, i, j;
char s[MAXN], aux, c;

long calc();
long expr();
long factor();
long termen();

int main() {
	freopen("bool.in", "r", stdin);
	freopen("bool.out", "w", stdout);
	scanf("%c", &c);
	q = -1;
	while (c != '\n') { 
		s[++q] = c; 
		scanf("%c", &c); 
	}
	scanf("%ld\n", &n);
	for (j = 1; j <= n; ++j) {
		scanf("%c", &aux);
		v[aux - 'A'] = !v[aux - 'A'];
		i = 0;
		printf("%ld", expr());
	}
	return 0;
}
long termen() {
	long f = factor(), aux;
	while (i < q && s[i] == 'A' && s[i + 1] == 'N') {
		i += 4;
		aux = factor();
		f &= aux;
	}
	return f;
}
long factor() {
	int f;
	if (s[i] == '(') {
		++i;
		f = expr();
		++i;
		if (s[i] == ' ') {
			++i;
		}
	} else {
		f = calc();
	}
	return f;
}
long calc() {
	long f;
	if (s[i] == 'N' && s[i + 1] == 'O') {
		i += 4;
		if (s[i] == '(') {
			++i;
			f = !expr();
			++i;
			if (s[i] == ' ') {
				++i;
			}
		} else {
			f = !calc();
		}
	} else {
		if (s[i] == 'T' && s[i + 1] == 'R')	{
			i += 4;
			if (s[i] == ' ') {
				++i;
			}
			f = 0;
		} else {
			if (s[i] == 'F' && s[i + 1] == 'A') {
				i += 5;
				if (s[i] == ' ') {
					++i;
				}
				f = 0;
			} else {
				f = v[s[i] - 'A'];
				++i;
				if (s[i] == ' ') {
					++i;
				}
			}
		}
	}
	return f;
}

long expr() {
	long f = termen(), aux;
	while (i < q && s[i] == 'O' && s[i + 1] == 'R') {
		i += 3;
		aux = termen();
		f = aux || f;
	}
	return f;
}