Pagini recente » Cod sursa (job #2721486) | Cod sursa (job #1011032) | Cod sursa (job #1950450) | Cod sursa (job #504962) | Cod sursa (job #2594016)
#include <bits/stdc++.h>
using namespace std;
ifstream in ("bool.in");
ofstream out("bool.out");
string expression, translatedExpression, op;
int n, i;
char ch;
vector < int > ascii[27];
bool evaluate();
bool expressionAND();
bool expressionOR() {
bool ans = expressionAND();
while (translatedExpression[i] == '&') {
++i;
ans &= expressionAND();
}
return ans;
}
bool expressionAND() {
bool ans, expressionVal = 0;
while (translatedExpression[i] == '!') {
expressionVal = (1 - expressionVal);
++i;
}
if (translatedExpression[i] == '1') {
ans = 1;
++i;
if (expressionVal)
return (1 - ans);
return ans;
}
if (translatedExpression[i] == '0') {
ans = 0;
++i;
if (expressionVal)
return (1 - ans);
return ans;
}
if (translatedExpression[i] == '(') {
++i;
ans = evaluate();
++i;
if (expressionVal)
return (1 - ans);
return ans;
}
}
bool evaluate() {
bool ans = expressionOR();
while (translatedExpression[i] == '|') {
++i;
ans |= expressionOR();
}
return ans;
}
int main() {
getline(in, expression);
in >> n;
for (int i = 0; i < expression.size(); i++) {
int closed = 0;
op = "";
while (i < expression.size() && expression[i] != ' ') {
if (expression[i] == '(') {
translatedExpression += '(';
i++;
continue;
}
if (expression[i] == ')') {
i++;
closed++;
continue;
}
op += expression[i];
++i;
}
if (op == "NOT") {
translatedExpression += '!';
} else if (op == "OR") {
translatedExpression += '|';
} else if (op == "AND") {
translatedExpression += '&';
} else if (op == "TRUE") {
translatedExpression += '1';
} else {
translatedExpression += '0';
}
if (op.size() == 1) { /// variabila
ascii[op[0] - 'A'].push_back(translatedExpression.size() - 1);
}
for (int j = 1; j <= closed; j++) {
translatedExpression += ')';
}
}
translatedExpression += ')';
for (int j = 1; j <= n; j++) {
in >> ch;
for (int j = 0; j < ascii[ch - 'A'].size(); j++) {
if (translatedExpression[ascii[ch - 'A'][j]] == '0') {
translatedExpression[ascii[ch - 'A'][j]] = '1';
} else {
translatedExpression[ascii[ch - 'A'][j]] = '0';
}
}
i = 0;
out << evaluate();
}
return 0;
}