Cod sursa(job #273588)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 8 martie 2009 19:21:54
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<cstdio>
#include<cstring>

bool a[100];
int n, i;
char p, e[2000], buf[2000];

bool EvalExpr(), EvalFactor(), EvalTermen();

int main(){
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);

    fgets(buf, 2000, stdin);
    for (i = 0, n = 0; buf[i] != '\n'; ++i)
        if ( buf[i] != ' ' )
            e[n++] = buf[i];

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

    scanf("%d\n",&n);

    for (; n; n--){
        scanf("%c", &p);
        a[p - 'A'] = !a[p - 'A'];
        i = 0;
        printf("%d",(EvalExpr()) ? 1 : 0);
    }
    printf("\n");

    fclose(stdin);
    fclose(stdout);

    return 0;
}

bool EvalExpr(){

bool r = EvalTermen();

    while (strncmp(e + i, "OR", 2) == 0 ){

        i += 2;
        r |= EvalTermen();

    }
    return r;
}

bool EvalTermen(){

bool r = EvalFactor();

    while (strncmp(e + i, "AND", 3) == 0 ){

        i += 3;
        r &= EvalFactor();
    }
    return r;
}

bool EvalFactor(){

bool f;

    if (strncmp(e + i, "TRUE", 4) == 0 ){
        i += 4;
        return 1;
    }
    else

        if (strncmp(e + i, "FALSE", 5) == 0 ){
            i += 5;
            return 0;
        }

    else

    if (strncmp(e + i, "NOT", 3) == 0 ){

        i += 3;
        f = ! EvalFactor();

    }
    else

        if (e[i] == '(' ){
            i++;
            f = EvalExpr();
            i++;
        }
        else
    {
        f = a[e[i]-'A'];
        i++;
    }
    return f;
}