Cod sursa(job #244854)

Utilizator CezarMocanCezar Mocan CezarMocan Data 16 ianuarie 2009 09:50:57
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <stdio.h>
#include <string.h>


char S[2005], *p, ch;
int n, i, a[27], l, q;

int termen();
int factor();

int eval(){
     int t = termen();
     while (*p == 'O' && *(p + 1) == 'R'){
           p += 2;
           t |= termen();
     }
    return t;   
}

int termen(){
     int f = factor();
     while (*p == 'A' && *(p+1) == 'N'){
           p += 3;
           f &= factor();
     }
    return f;
}

int factor(){
     int poz=1,t;
     if (*p == 'N' && *(p + 1)=='O'){
        p += 3;
        poz = 0;
        t = factor();
     }
     else
         if (*p == '('){
            p++;
            t = eval();
            p++;
         }
         else
             if (*p == 'T' && *(p + 1) == 'R') {
                    p += 4; t = 1;
             }
             else 
                if (*p == 'F' && *(p + 1) == 'A'){
                    p += 5; 
                    t = 0;
                }
                 else { 
                    t = a[*p-'A'];
                    p++;
                 }
     if (poz) 
        return t;
     else 
        if (t)
            return 0;
        else 
            return 1;
}

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

    gets(S);
    l = strlen(S);
    q = -1;
    for (i = 0; i < l; i++)
        if(S[i] != ' ')
            S[++q] = S[i];
    for (i=++q; i < l; i++)
        S[i] = 0;

    scanf("%d\n", &n);
    for (i = 1; i <= n;i++){
        scanf("%c", &ch);
        if (a[ch - 'A'])
            a[ch - 'A'] = 0;
        else 
            a[ch - 'A'] = 1;
        p = S;
        printf("%d", eval());
    }
    printf("\n");
    return 0;
}