Cod sursa(job #3276964)

Utilizator BledeaAlexBledea Alexandru BledeaAlex Data 15 februarie 2025 10:51:47
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.01 kb
#include <bits/stdc++.h>

using namespace std;

const int L_MAX = 1005, N_MAX = 105;
const int MAX_PRIORITY = 2; /// = nr prioritati
unsigned int pos = 0; /// positia unde am ajuns, variabila globala folosita de functiile recursive
int N;
bool val[(int)'Z' + 1];
string expr;
string updates;

vector<string> operators = {
    "OR",
    "AND"
};

unordered_map<string, int> priority = {
    {"OR", 0},
    {"AND", 1}
};

void SetInput(string name)
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    (void)!freopen((name + ".in").c_str(), "r", stdin);
    (void)!freopen((name + ".out").c_str(), "w", stdout);
}

int GetPriority()
{
    if(expr.substr(pos, 2) == "OR")
        return 0;
    if(expr.substr(pos, 3) == "AND")
        return 1;

    return -1; /// undefined
}

inline void Calc(bool& a, bool& b, string& op)
{
    if(op == "OR")  a |= b;
    if(op == "AND") a &= b;
}

bool EvalFactor();

/// Functie recursiva pt evaluare, in functie de nivelul curent de proritate
bool Eval(int priorityLevel)
{
    if(priorityLevel == MAX_PRIORITY) /// Am ajuns la ultimul nivel
        return EvalFactor();

    bool result = Eval(priorityLevel + 1); /// evaluam primul operand

    string op = operators[priorityLevel];

    if(expr.substr(pos, op.size()) == op)
    {
        pos += op.size();
        while(expr[pos] == ' ') pos++; /// Sarim si peste spatiul (' ') de dupa operator, daca exista

        bool nextOperand = Eval(priorityLevel+1);

        Calc(result, nextOperand, op);
    }

    return result;
}

/// Functie pentru a evalua nr. si expresii intre paranteza
bool EvalFactor()
{
    bool result = 0;
    if(expr[pos] == '(')
    {
        pos++; /// Sarim peste '('
        result = Eval(0);
        pos++; /// Sarim peste ')'
    }
    else if(expr.substr(pos, 3) == "NOT")
    {
        pos += 3;
        while(expr[pos] == ' ') pos++; /// Sarim si preste spatiul (' ') de dupa operatorul NOT, daca exista
        result = not Eval(0);
    }
    else if(expr.substr(pos, 4) == "TRUE")
    {
        pos += 4;
        result = true;
    }
    else if(expr.substr(pos, 5) == "FALSE")
    {
        pos += 5;
        result = false;
    }
    else if(expr[pos] >= 'A' && expr[pos] <= 'Z') /// Avem o litera (variabila)
    {
        result = val[(int)expr[pos]];
        pos++; /// crestem pozitia dupa ce salvam valoarea
    }

    while(expr[pos] == ' ') pos++; /// Sarim preste spatiul (' ') de dupa factor, daca exista

    return result;
}

void ReadInput()
{
    char temp[2];
    getline(cin, expr);
    cin >> N;
    cin.getline(temp, 2); /// scapam de '\n'
    getline(cin, updates);
}

void Solve()
{
    for(int i = (int)'A'; i <= (int)'Z'; i++)
        val[i] = false;

    for(char c : updates)
    {
        val[(int)c] = not val[(int)c];
        pos = 0;
        cout << Eval(0);
    }

    cout << '\n';
}

int main()
{
    SetInput("bool");

    ReadInput();
    Solve();

    return 0;
}