Cod sursa(job #2956549)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 19 decembrie 2022 18:54:55
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")

using namespace std;

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

const int MAX_SIZE = 1000;
char input[MAX_SIZE + 10];

string original, aux, eval, changes;
int poz, lim, q;
map <char, bool> turn;

bool expresie();

bool factor(){
    bool answer;
    if(eval[poz] == '!'){
        poz++; ///sar peste !
        answer = (!factor());
    }else if(eval[poz] == '('){
        poz++; ///sar peste (
        answer = expresie();
        poz++; ///sar peste )
    }else{
        if(eval[poz] == '0')
            answer = false;
        else
            answer = true;
        poz++;
    }
    return answer;
}

bool termen(){
    bool answer = factor();
    while(poz < lim && eval[poz] == '*'){
        poz++; ///sar peste *
        answer &= factor();
    }
    return answer;
}

bool expresie(){
    bool answer = termen();
    while(poz < lim && eval[poz] == '+'){
        poz++; ///sar peste +
        answer |= termen();
    }
    return answer;
}

int main(){
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr), fout.tie(nullptr);

    fin.getline(input, MAX_SIZE + 5);

    original = "";
    for(int i=0; input[i] != 0; i++)
        original += input[i];
    fin>>q>>changes;

    for(char ch='A'; ch<='Z'; ch++)
        turn[ch] = false;

    for(int qi=0; qi < q; qi++){
        turn[changes[qi]] = (!turn[changes[qi]]);

        eval = "";
        for(int i=0; i < (int)original.size(); i++)
            if(original[i] != ' '){
                if('A' <= original[i] && original[i] <= 'Z'){
                    aux = original[i];
                    while(i+1 < (int)original.size() && ('A' <= original[i+1] && original[i+1] <= 'Z')){
                        i++;
                        aux += original[i];
                    }

                    if(aux == "TRUE") eval += "1";
                    else if(aux == "FALSE") eval += "0";
                    else if(aux == "NOT") eval += "!";
                    else if(aux == "AND") eval += "*";
                    else if(aux == "OR") eval += "+";
                    else{
                        if(turn[aux[0]] == false)
                            eval += "0";
                        else
                            eval += "1";
                    }
                }else{
                    eval += original[i];
                }
            }

        poz = 0, lim = (int)eval.size();
        fout<<expresie();
    }

    return 0;
}