Cod sursa(job #306304)

Utilizator razvan_emPrecupas Razvan razvan_em Data 20 aprilie 2009 12:40:39
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 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;   
}