Cod sursa(job #2716178)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 4 martie 2021 19:52:35
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;

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

int evalLowPr();

char sir[1005];
int vals[27], i = 0;
string s;


int evalHighPr(){
    bool nu = false;
    int f;
    while(s[i] == '!'){
        ++i;
        nu = !nu;
    }
    if(s[i] == '('){
        ++i;
        f = evalLowPr();
        ++i;

        if(nu)
            return !f;
        return f;
    }
    else
    {
        if(s[i] == '1' || s[i] == '0'){
            if(nu)
                return !(s[i] - '0');
            return (s[i] - '0');
        }
        if(nu)
            return !vals[s[i] - 'A'];
        return vals[s[i] - 'A'];
    }
}


int evalMidPr(){
    int f = evalHighPr();
    while(i < s.size()){
        if(s[i] == '&')
            ++i, f = f && evalHighPr();
        else break;
    }
    return f;
}

int evalLowPr(){
    int t = evalMidPr();
    while(i < s.size()){
        if(s[i] == '|')
            ++i, t = t || evalMidPr();
        else break;
    }

    return t;
}

int main()
{
    while(1){
        string ax;
        fin >> ax;

        if(isdigit(ax[0]))
            break;

        if(ax == "AND")
            s += "&";
        else if(ax == "OR")
            s += "|";
        else if(ax == "TRUE")
            s += "1";
        else if(ax == "FALSE")
            s += "0";
        else if(ax == "NOT")
            s += "!";
        else s += ax;
    }

    string modif;
    fin >> modif;

    int n = modif.size();
    for(int i = 0; i < n; ++i){
        vals[modif[i] - 'A'] = 1 - vals[modif[i] - 'A'];

        fout << evalLowPr();
    }
    return 0;
}