Cod sursa(job #2736181)

Utilizator As932Stanciu Andreea As932 Data 3 aprilie 2021 11:24:07
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");

const int lMax = 1e3 + 5;

int i1;
char ex0[lMax];
bool v[30];
string ex1;

bool eval();
bool termen();
bool factor();

bool eval(){
    bool ans = termen();

    while(ex1[i1] == '|'){
        i1++;
        ans = ans || termen();
    }

    return ans;
}

bool termen(){
    bool ans = factor();

    while(ex1[i1] == '&'){
        i1++;
        ans = ans & factor();
    }

    return ans;
}

bool factor(){
    bool ans;

    if(ex1[i1] == '('){
        i1++;
        ans = eval();
        i1++;
    } else if(ex1[i1] == '!') {
        i1++;
        ans = !eval();
    } else if(ex1[i1] >= 'A' && ex1[i1] <= 'Z'){
        ans = v[ex1[i1] - 'A'];
        i1++;
    } else {
        ans = ex1[i1] - '0';
        i1++;
    }

    return ans;
}

void solve(){
    int n;
    fin >> n;

    while(n--){
        char var;
        fin >> var;

        v[var - 'A'] = !v[var - 'A'];

        i1 = 0;

        fout << eval();
    }
}

bool alpha(char c){
    return (c >= 'A' && c <= 'Z');
}

void proc(){
    int i0 = 0, j0 = strlen(ex0);
    ex1 = "";

    while(i0 < j0){
        if(alpha(ex0[i0])){
            if(alpha(ex0[i0 + 1])){
                if(ex0[i0] == 'A'){
                    ex1 += "&";
                    i0 += 3;
                } else if(ex0[i0] == 'N'){
                    ex1 += "!";
                    i0 += 3;
                } else if(ex0[i0] == 'O'){
                    ex1 += "|";
                    i0 += 2;
                } else if(ex0[i0] == 'T'){
                    ex1 += "1";
                    i0 += 4;
                } else if(ex0[i0] == 'F'){
                    ex1 += "0";
                    i0 += 5;
                }
            } else
                ex1 += ex0[i0++];
        } else if(ex0[i0] == '(' || ex0[i0] == ')')
            ex1 += ex0[i0++];
        else
            i0++;
    }
}

int main()
{
    fin.getline(ex0, lMax);

    proc();

    solve();

    return 0;
}