Cod sursa(job #246042)

Utilizator raduzerRadu Zernoveanu raduzer Data 19 ianuarie 2009 19:12:30
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <cstring>

const int MAX_X = 2010;
const int MAX_N = 210;
const int MAX_L = 26;

char s[MAX_X + 1], a[MAX_N + 1], *p, c[MAX_L];
int n, l;

int termen();
int factor();

int expr() 
{
	int t = termen();
	for (; *p == 'O' && *(p + 1) == 'R'; p += 2, t |= termen());
	return t;
} 

int termen() 
{
	int f = factor();
	for (; *p == 'A' && *(p + 1) == 'N'; p += 3, f &= factor());
	return f;
}

int factor() 
{
	int ret;
	
	if (*p == 'N' && *(p+1) == 'O') 
	{
		p += 3;
		ret = factor();
		return !ret;
	} 
	
	if (*p == '(') 
	{
		++p;
		ret = expr();
		++p;
		return ret;
	}
	
	if (*p == 'T' && *(p + 1) == 'R') 
	{
		p += 4;
		return 1;
	}
	
	if (*p == 'F' && *(p + 1) == 'A') 
	{
		p += 5;
		return 0;
	} 
	
	ret = c[*p - 'A'];
	++p;
	return ret;
}

int main() 
{
	freopen("bool.in","rt",stdin);
	freopen("bool.out","wt",stdout);
	
	fgets(s, MAX_X, stdin);
	l = strlen(s);
	
	int z = 0;
	
	for (int i = 0; i < l; ++i)
		if (s[i] != ' ') s[z++] = s[i];
	
	s[z] = '\0';
		
	scanf("%d\n", &n);
	fgets(a, MAX_N, stdin);
	
	for (int i = 0; i < n; ++i) 
	{
		c[a[i] - 'A'] = !c[a[i] - 'A'];
		p = s;
		printf("%d", expr());
	}
}