Cod sursa(job #2594016)

Utilizator RobertLearnsCDragomir Robert. RobertLearnsC Data 5 aprilie 2020 11:06:10
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.87 kb
#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;
}