Cod sursa(job #238846)

Utilizator Omega91Nicodei Eduard Omega91 Data 3 ianuarie 2009 13:27:55
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <cstdio>
#include <cstring>
#include <cctype>
char *sir, pol[1005], start[1005], *end;
int k = 0, p = 0;
const int elsize = sizeof(int) * 8, NMAX = 102;
const int sz = NMAX / elsize + 1;
int el[30][sz] = {};

void exp();
void term();
void fact();

void exp()
{
	term();
	while(sir < end && !memcmp(sir, "OR", 2)) {
			sir += 2;
			term();
			pol[p++] = '+';
		}
}

void term()
{
	fact();
	while(sir < end && !memcmp(sir, "AND", 3)) {
		sir += 3;
		fact();
		pol[p++] = '*';
	}
}

void fact()
{
	if ( *sir == '(' ) {
		sir++;
		exp();
		sir++;
	}
	else if (!memcmp(sir, "NOT", 3)) {
		sir += 3;
		fact();
		pol[p++] = '-';
	}
	else if (!memcmp(sir, "TRUE", 4)) {
		sir += 4;
		pol[p++] = '1';
	}
	else if (!memcmp(sir, "FALSE", 5)) {
		sir += 5;
		pol[p++] = '0';
	}
	else if (isalpha(*sir)) {
		pol[p++] = *(sir++);
	}
}

void sanitize(char x[])
{
	int i, q = 0;
	for (i = 0; x[i]; ++i)
		if (x[i] != ' ') x[q++] = x[i];
	x[q] = 0;
		
}

void create_polish_exp()
{
	int lg;
	sanitize(sir);
	lg = strlen(sir);
	end = sir + lg;
	exp();
	pol[p] = 0;
}

int* eval_polish_exp()
{
	char *x = pol;
	int stack[400][sz] = {}, top = 0, aux;
	for (; *x; ++x)
		if ( isalpha(*x) ) {
			++top;
			for (aux = 0; aux != sz; ++aux)
				stack[top][aux] = el[*x - 'A'][aux];
		}
		else if (*x == '0') {
			++top;
			for (aux = 0; aux != sz; ++aux)
				stack[top][aux] = 0;
			}
		else if (*x == '1') {
			++top;
			for (aux = 0; aux != sz; ++aux)
				stack[top][aux] = ~0;
			}
		else if (*x == '-') {
			for (aux = 0; aux != sz; ++aux)
				stack[top][aux] = ~stack[top][aux];
		}
		else if (*x == '+') {
			for (aux = 0; aux != sz; ++aux)
				stack[top - 1][aux] |= stack[top][aux];
				--top;
		}
		else if (*x == '*') {
			for (aux = 0; aux != sz; ++aux)
				stack[top - 1][aux] &= stack[top][aux];
				--top;
		}
	int *t = new int [sz];
	for (aux = 0; aux != sz; ++aux)
		t[aux] = stack[1][aux];
	return t;
}

int main()
{
	int N, i, j;
	char changes[NMAX];
	sir = start;
	freopen("bool.in", "r", stdin);
	freopen("bool.out", "w", stdout);
	scanf("%[^\n]s", sir);
	create_polish_exp();
	scanf("%d\n%s", &N, changes);
	
	for (i = 0; i != N; ++i) {
		el[ changes[i] - 'A' ][i / elsize] ^= (~0 << (i & (elsize - 1)));
		for (j = i / elsize + 1; j != sz; ++j)
			el[ changes[i] - 'A' ][j] = ~el[ changes[i] - 'A' ][j];
	}
	
	int *t = eval_polish_exp();
	
	for (i = 0; i != N; ++i)
		printf( "%d", bool(t[i / elsize] & (1 << (i & (elsize - 1)))) );
	
	//printf("%s\n%s\n", sir, pol);
	fclose(stdin); fclose(stdout);
	return 0;
}