Pagini recente » Istoria paginii utilizator/lyonhater | Monitorul de evaluare | Cod sursa (job #2289) | Statistici OHYEAHYEAH (MAXIMILLIANMUS) | Cod sursa (job #3276989)
#include <bits/stdc++.h>
using namespace std;
const int L_MAX = 1005, N_MAX = 105;
const int MAX_PRIORITY = 2; /// = nr. de 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}
};
unordered_map<string, function<bool(bool, bool)> > operations = {
{"OR", [&](bool a, bool b){return (a | b); } },
{"AND", [&](bool a, bool b){return (a & b); } }
};
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);
}
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];
while(pos < expr.size() && expr.substr(pos, op.size()) == op)
{
pos += op.size();
if(expr[pos] == ' ') pos++; /// Sarim si peste spatiul (' ') de dupa operator, daca exista
bool nextOperand = Eval(priorityLevel+1);
result = operations[op](result, nextOperand);
}
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;
if(expr[pos] == ' ') pos++; /// Sarim si preste spatiul (' ') de dupa operatorul NOT, daca exista
result = not EvalFactor();
}
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
}
if(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++) /// Init
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;
}