Cod sursa(job #2832979)

Utilizator Theodor17Pirnog Theodor Ioan Theodor17 Data 14 ianuarie 2022 15:54:07
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int NMAX = 1e3;
const int MMAX = 2e2;
char s[NMAX + 5];
char t[NMAX + 5], ch;
bool valori[MMAX];
int n, m, modificari;
bool expresie(); // o expresie este formata din mai multi termeni legati prin OR('|')
bool termen(); // un termen este format din mai multi factori legati prin AND('&')
bool factor(); // un factor este o variabila simpla sau o variabila negata ('0' sau "!0")

void build(){

    m = 0;
    n = 0;
    string x;
    int i = 0;

    while(s[i]){

        if(s[i] != char(32)){

            if(s[i] == '(' || s[i] == ')')
                t[m] = s[i], m++, i++;
            else{
                
                x.clear();

                while(isupper(s[i]))
                    x += s[i], i++;

                if(x == "OR")
                    t[m] = '|';
                else if(x == "AND")
                    t[m] = '&';
                else if(x == "NOT")
                    t[m] = '!';
                else if(x == "TRUE")
                    t[m] = '1';
                else if (x == "FALSE")
                    t[m] = '0';
                else{

                    ch = x[0];
                    t[m] = (valori[ch] + 48);

                }

                m++;
            }

        }else
            i++;

    }

    //cout << "expresie = " << t << "\n";

}

bool expresie(){

    bool x = termen();

    while(t[n] == '|'){

        n++;
        bool t = termen();
        x |= t;

    }

    return x;
}

bool termen(){

    bool x = factor();

    while(t[n] == '&'){

        n++;
        bool f = factor();
        x &= f;

    }   

    return x;
}

bool factor(){

    bool x = 0, negare = 0;
    while(t[n] == '!')
        negare = !negare, n++;

    if(t[n] == '('){

        n++;
        x = expresie();
        n++;

        if(!negare)
            return x;

        return !x;
    }

    if(t[n] == '0')
        x = 0;
    else x = 1;

    n++;

    if(!negare)
        return x;

    return !x;
}

int main(){


    cin.getline(s, NMAX);
    cin >> modificari;

    build();
    
    for(int i = 0; i < modificari; i++){
        
        cin >> ch;
        valori[ch] = !valori[ch];
        build();
        cout << expresie();
    
    }

}