Cod sursa(job #2076430)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 26 noiembrie 2017 16:15:49
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("bool.in");
ofstream g("bool.out");

int N, M, i, sz, p, val[34];
char c, st[1104], s[1104];

int eval_and();
int eval_or();
int eval_not();

int eval() {
    int res;
    if(s[p] == 't') {
        ++p;
        return 1;
    } else if(s[p] == 'f') {
        ++p;
        return 0;
    } else if(s[p] >= 'A' && s[p] <= 'Z') {
        ++p;
        res = val[s[p - 1] - 'A'];
    } else if(s[p] == '(') {
        ++p;
        res = eval_or();
        ++p;
    }
    return res;
}
int eval_or() {
    int res = eval_and();
    while(s[p] == '|' && p < sz) {
        ++p;
        res = res | eval_and();
    }
    return res;
}
int eval_and() {
    int res = eval_not();
    while(s[p] == '&' && p < sz) {
        ++p;
        res = res & eval_not();
    }
    return res;
}
int eval_not() {
    if(s[p] == '!') {
        ++p;
        return !eval_not();
    }
    return eval();
}
int main() {
    f.getline(st,1010);
    N=strlen(st);
    for(int i = 0; i < N;) {
        if(st[i] == 'A' && st[i + 1] == 'N')
            s[++sz] = '&', i += 3;
        else if(st[i] == 'O' && st[i + 1] == 'R')
            s[++sz] = '|', i += 2;
        else if(st[i] == 'N' && st[i + 1] == 'O')
            s[++sz] = '!', i += 3;
        else if(st[i] == 'T' && st[i + 1] == 'R')
            s[++sz] = 't', i += 4;
        else if(st[i] == 'F' && st[i + 1] == 'A')
            s[++sz] = 'f', i += 5;
        else {
            if(st[i] <= 'Z' && st[i] >= 'A' || st[i] == '(' || st[i] == ')')
                s[++sz] = st[i];
            i++;
        }
    }
    f >> M;
    while(M--) {
        f >> c;
        val[c - 'A'] ^= 1;
        p = 1;
        g << eval_or();
    }

    return 0;
}