Cod sursa(job #129132)

Utilizator pishtymatei silviu pishty Data 28 ianuarie 2008 18:04:30
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <stdio.h>     
#include <string.h>     
#define NMAX 1001     
     
char e[NMAX];     
int N, k, v['Z'-'A'+1];     
     
int evalf();     
int evalt();     
int evale();     
     
int main() {     
    int i;     
    char c;     
    freopen("bool.in", "r", stdin);     
    freopen("bool.out", "w", stdout);     
    fgets(e, NMAX, stdin);     
    //printf("%d ", strlen(e));     
    scanf("%d\n", &N);     
    for (i = 0; i < N; ++i) {     
        scanf("%c", &c);     
        k = 0, v[c-'A'] = !v[c-'A'];     
        printf("%d", evale());     
    }     
    //printf("%d ", evale());     
    //printf("%d", k);     
    return 0;     
}     
     
int evalf() {     
   if (e[k] == '(') {     
        ++k;     
        return evale();     
    }     
    else if (e[k] == 'N' && e[k+1] == 'O') {     
        k += 4;     
        return !evalf();     
    }     
    else if (e[k] == 'T' && e[k+1] == 'R') {     
        k += 4;     
        if (e[k] == ' ')     
            ++k;     
        return 1;     
    }     
    else if (e[k] == 'F' && e[k+1] == 'A') {     
        k += 5;     
        if (e[k] == ' ')     
            ++k;     
        return 0;     
    }     
    else {     
        int r = v[e[k]-'A'];     
        ++k;     
        if (e[k] == ' ')     
            ++k;     
        return r;     
    }     
}     
int evalt() {     
    int r = evalf();     
    while (e[k] == 'A' && e[k+1] == 'N') {     
        k += 4;     
        r &= evalf();     
    }     
    return r;     
}     
int evale() {     
    int r = evalt();     
    while (e[k] == 'O' && e[k+1] == 'R' && e[k] && e[k] != ')') {     
        k += 3;     
        r |= evalt();     
    }     
    ++k;     
    if (e[k] == ' ')     
        ++k;     
    //printf("%d %d %c\n", k, r, e[k]);     
    return r;     
}