Cod sursa(job #2861854)

Utilizator Theodor17Pirnog Theodor Ioan Theodor17 Data 4 martie 2022 16:34:30
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>
#include <bitset>

using namespace std;

ifstream cin("bool.in");
ofstream cout("bool.out");

const int NMAX = 1e3;
const int alfa = 1e2;

char expresie[NMAX + 5];
bitset <alfa> val;
int p, n;

bool eval();
bool AND();
bool NOT();

bool eval(){

    bool x = AND();
    while(expresie[p] == '|'){

        p++;
        bool t = AND();
        x = x | t;

    }

    return x;
}

bool AND(){

    bool x = NOT();
    while(expresie[p] == '&'){

        p++;
        bool t = NOT();
        x = x & t;

    }

    return x;
}

bool NOT(){

    bool x = 0, semn = 0;
    while(expresie[p] == '!')
        semn = !semn, p++;

    if(expresie[p] == '('){

        p++;
        x = eval();
        p++;

        if(semn)
            return !x;

        return x;
    }

    x = val[expresie[p++]];

    if(semn)
        return !x;

    return x;
}

void parsare(){

    int leftwall = 0, k = 0;
    while(expresie[k]){

        if(expresie[k] == 'A' && expresie[k + 1] == 'N'){
            
            expresie[leftwall++] = '&';
            k += 3;

        }else if(expresie[k] == 'N' && expresie[k + 1] == 'O'){

            expresie[leftwall++] = '!';
            k += 3;

        }else if(expresie[k] == 'O' && expresie[k + 1] == 'R'){

            expresie[leftwall++] = '|';
            k += 2;

        }else if(expresie[k] == 'T' && expresie[k + 1] == 'R'){

            expresie[leftwall++] = '1';
            k += 4;

        }else if(expresie[k] == 'F' && expresie[k + 1] == 'A'){

            expresie[leftwall++] = '0';
            k += 5;

        }else if(expresie[k] != char(32))
            expresie[leftwall++] = expresie[k++];
        else k++;

    }

    expresie[leftwall] = '\0';
}

int main(){

    cin.getline(expresie, NMAX + 1);
    parsare();

    val['1'] = 1;
    
    cin >> n;

    char ch;
    for(int i = 0; i < n; i++){

        cin >> ch;
        val[ch] = !val[ch];

        p = 0;
        cout << eval();

    }

}