Cod sursa(job #911112)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 11 martie 2013 12:46:24
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <cstdio>
#include <cstring>
using namespace std;

char buffer[1005];
char buf[1005];
bool val[256];
int id,len;

bool eand();
bool eor();
bool eval();

bool eor() {
    bool r1,r2;
    r1 = eand();
    while (buf[id] == '|') {
        id++;
        r2 = eand();
        r1 = r1 || r2;
    }
    return r1;
}

bool eand() {
    bool r1,r2;
    r1 = eval();
    while (buf[id] == '&') {
        id++;
        r2 = eval();
        r1 = r1 && r2;
    }
    return r1;
}

bool eval() {
    bool notted = false;
    bool r;
    while (buf[id] == '!') {
        notted = !notted;
        id++;
    }
    if (buf[id] == '(') {
        id++;
        r = eor();
        id++;
    } else if ('A' <= buf[id] && buf[id] <= 'Z') {
        r = val[buf[id]];
    } else if (buf[id] == 1) r = true;
    else if (buf[id] == 0) r = false;
    if (notted) return !r;
    else return r;
}

int main() {
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    fgets(buffer,1001,stdin);
    len = strlen(buffer);
    for (int i=0;i<len;i++) {
        if ('A' <= buffer[i] && buffer[i] <= 'Z' && (buffer[i+1] <= 'A' || buffer[i+1] >= 'Z')) {
            buf[id++] = buffer[i];
            continue;
        }
        if (buffer[i] == 'A' && buffer[i+1] == 'N' && buffer[i+2] == 'D') {
            buf[id++] = '&';
            i += 2;
            continue;
        }
        if (buffer[i] == 'N' && buffer[i+1] == 'O' && buffer[i+2] == 'T') {
            buf[id++] = '!';
            i += 2;
            continue;
        }
        if (buffer[i] == 'O' && buffer[i+1] == 'R') {
            buf[id++] = '|';
            i++;
            continue;
        }
        if (buffer[i] == 'T' && buffer[i+1] == 'R' && buffer[i+2] == 'U' && buffer[i+3] == 'E') {
            buf[id++] = '1';
            i += 3;
            continue;
        }
        if (buffer[i] == 'F' && buffer[i+1] == 'A' && buffer[i+2] == 'L' && buffer[i+3] == 'S' && buffer[i+4] == 'E') {
            buf[id++] = '0';
            i += 4;
            continue;
        }
        if (buffer[i] == '(' || buffer[i] == ')') {
            buf[id++] = buffer[i];
        }
    }
    int t; id = 0;
    scanf("%d",&t);
    while (t--) {
        id = 0;
        char crt = 0;
        while ('A' > crt || crt > 'Z') scanf("%c",&crt);
        val[crt] = !val[crt];
        printf("%d",(eval())?(1):(0));
    }
    printf("\n");
    return 0;
}