Cod sursa(job #1008398)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 10 octombrie 2013 22:28:40
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <cstring>
#define FIN "bool.in"
#define FOUT "bool.out"

char buf[2000], e[2000];
bool A['z'-'a'+2];
long i, n;

void parse() {
    long n=0;
    for (i=0, n=0; buf[i]!='\n'; ++i)
        if ( buf[i] != ' ' )
            e[n++] = buf[i];
}

bool ev();

int main() {
    char c;
    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    fgets(buf, 2000, stdin);
    parse();
//  fprintf(stderr,"%s",e);

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

    scanf("%ld\n", &n);
    while ( n-- ) {
        scanf("%c", &c);
        A[c-'A'] = !A[c-'A'];
        i = 0;
        printf("%d", (ev()) ? 1 : 0);
    }
    printf("\n");

    fclose(stdin);
    fclose(stdout);
    return 0;
}

bool op1(); // pt and
bool op2(); // pt not

bool ev() { // pt or
    bool ret = op1();
    while ( strncmp(e+i, "OR", 2)==0 ) {
        i+=2;
        ret |= op1();
    }
    return ret;
}

bool op1() {
    bool ret = op2();
    while ( strncmp(e+i,"AND", 3)==0 ) {
        i+=3;
        ret &= op2();
    }
    return ret;
}

bool op2() {
    bool ret;
    if ( strncmp(e+i, "TRUE", 4)==0 ) {
        i+=4;
        return true;
    }
    if (strncmp(e+i,"FALSE", 5)==0) {
        i+=5;
        return false;
    }
    if ( strncmp(e+i,"NOT", 3)==0 ) {
        i+=3;
        ret = ! op2();
    }
    else {
        if ( e[i] == '(' ) {
            ++i;
            ret =  ev();
            ++i;
        }
        else {
            ret = A[e[i]-'A'];
            i++;
        }
    }
    return ret;
}