Cod sursa(job #632426)

Utilizator sebii_cSebastian Claici sebii_c Data 11 noiembrie 2011 04:03:11
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <stdio.h>
#include <string.h>
#define NMAX 1005

char A[NMAX], S[NMAX], *p = S;
bool val[27];
int sz;

bool AND(int); bool OR(int); bool NOT(int);
bool TRUE(int); bool FALSE(int);
int eval(); int factor(); int term(); 

bool AND(int pos)
{
    return (A[pos] == 'A' && A[pos+1] == 'N'
		    && A[pos+2] == 'D');
}

bool OR(int pos)
{
    return (A[pos] == 'O' && A[pos+1] == 'R');
}

bool NOT(int pos)
{
    return (A[pos] == 'N' && A[pos+1] == 'O' 
		    && A[pos+2] == 'T');
}

bool TRUE(int pos)
{
    return (A[pos] == 'T' && A[pos+1] == 'R' 
		&& A[pos+2] == 'U' && A[pos+3] == 'E');
}

bool FALSE(int pos)
{
    return (A[pos] == 'F' && A[pos+1] == 'A'
	    && A[pos+2] == 'L' && A[pos+3] == 'S'
	    && A[pos+4] == 'E');
}

void read()
{
    fgets(A, NMAX, stdin);
    int i, len = strlen(A);
    
    for (i=0; i<len; ++i) {
	if (AND(i)) {
	    S[sz++] = '&';
	    i += 2;
	}
	else if (OR(i)) {
	    S[sz++] = '|';
	    i += 1;
	}
	else if (NOT(i)) {
	    S[sz++] = '!';
	    i += 2;
	}
	else if (TRUE(i)) {
	    S[sz++] = '1';
	    i += 3;
	}
	else if (FALSE(i)) {
	    S[sz++] = '0';
	    i += 4;
	}
	else if (A[i] == ' ');
	else
	    S[sz++] = A[i];
    }
}

int eval()
{
    int f = factor();
    if (*p == '|')
	while (*p == '|') {
	    ++p;
	    f |= factor();
	}
    return f;
}

int factor()
{
    int t = term();
    if (*p == '&')
	while (*p == '&') {
	    ++p;
	    t &= term();
	}
    return t;
}

int term()
{
    int r = 0;
    if (*p == '(')  
	++p, r = eval(), ++p;
    if (*p == '!')
	++p, r = !term();
    else if (*p == '1')
	++p, r = 1;
    else if (*p == '0')
	++p, r = 0;
    else if (*p >= 'A' && *p <= 'Z')
	r = val[*p - 'A'], ++p;
    return r;
}

int main()
{
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    read();
    int n, i;
    char c;
    scanf("%d\n", &n);
    for (i=0; i<n; ++i) {
	scanf("%c", &c);
	val[c-'A'] ^= 1;
	p = S;
	printf("%d", eval());
    } 
    return 0;
}