Cod sursa(job #3134796)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 30 mai 2023 22:59:11
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>

using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");
int i, k, q;
int v[132];
char s[1002], c[1002], p;

static inline int eval();
static inline int Exor();
static inline int Eand();
static inline int Eor();

static inline int Eor() {
    int x = Eand();
    while(c[i] == '|') {
        i++;
        x |= Eand();
    }
    return x;
}

static inline int Eand() {
    int x = Exor();
    while(c[i] == '&') {
        i++;
        x &= Exor();
    }
    return x;
}

static inline int Exor() {
    int x = eval();
    while(c[i] == '^') {
        i++;
        x ^= eval();
    }
    return x;
}

static inline int eval() {
    int r;
    if(c[i] == '(') {
        i++;
        r = Eor();
        i++;
    }
    else if(c[i] == '1') {
        i++;
        return 1;
    }
    else if(c[i] == '0') {
        i++;
        return 0;
    }
    else return v[c[i++]];
    return r;
}

int main() {
    fin.getline(s, 102);
    for(i = 0; s[i] != 0; i++) {
        if(s[i] == ' ') continue;
        if(s[i] == '(' || s[i] == ')') {
            c[k++] = s[i];
            continue;
        }
        if(s[i] == 'T' && s[i + 1] == 'R') {
            c[k++] = '1';
            i += 3;
            continue;
        }
        if(s[i] == 'F' && s[i + 1] == 'A') {
            c[k++] = '0';
            i += 4;
            continue;
        }
        if(s[i] == 'O' && s[i + 1] == 'R') {
            c[k++] = '|';
            i++;
            continue;
        }
        if(s[i] =='A' && s[i + 1] == 'N') {
            c[k++] = '&';
            i += 2;
            continue;
        }
        if(s[i] == 'N' && s[i + 1] == 'O') {
            c[k++] = '1';
            c[k++] = '^';
            i += 2;
            continue;
        }
        c[k++] = s[i];
    }

    fin >> q;
    while(q--) {
        fin >> p;
        v[p] = 1 - v[p];
        i = 0;
        fout << Eor();
    }

    return 0;
}