Cod sursa(job #2330574)

Utilizator ContDeRacistAliniateEBlat ContDeRacist Data 28 ianuarie 2019 16:57:18
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
///    __/^^^^^^^^^^^\__
///   /   <.^>   <.^>   \
///   |       <         |
///    \   -\_____/-   /
///     \     ^ ^     /
///      \___________/
///         \     /
///          |   |
///       ^----------^

#include <fstream>
#include <vector>
#include <algorithm>
#include <cassert>

using namespace std;

ifstream cin("bool.in");
ofstream cout("bool.out");

string s;

bool expresie();
bool tinand();
bool termen();
int t(0);

bool termen() {
    bool noht(0);
    if (s[t] == '!')
        noht = 1, ++t;
    if (s[t] == '(') {
        ++t;
        return expresie() ^ noht;
    }
    else
        return (s[t++] - '0') ^ noht;
}

bool tinand() {
    bool ans = termen();

    while (s[t] == '&' && t < s.size()) {
        ++t;
        ans &= termen();
    }
    return ans;
}

bool expresie() {
    bool raspuns = tinand();

    while (t < s.size() && s[t] == '|') {
        ++t;
        raspuns |= tinand();
    }
    ++t;///)
    return raspuns;
}

int main()
{
    string raws;
    getline(cin, raws);
    for (int i = 0; i < raws.size(); ++i) {
        if (raws[i] == ' ')
            continue;
        if (i < raws.size() - 1 && raws[i] == 'T' && raws[i + 1] == 'R')
            s = s + '1', i += 3;
        else if (i < raws.size() - 1 && raws[i] == 'F' && raws[i + 1] == 'A')
            s = s + '0', i += 4;
        else if (i < raws.size() - 1 && raws[i] == 'A' && raws[i + 1] == 'N')
            s = s + '&', i += 2;
        else if (i < raws.size() - 1 && raws[i] == 'N' && raws[i + 1] == 'O')
            s = s + '!', i += 2;
        else if (i < raws.size() - 1 && raws[i] == 'O' && raws[i + 1] == 'R')
            s = s + '|', i++;
        else
            s = s + raws[i];
    }
    raws = s;
    int n;
    string q;
    cin >> n >> q;
    for (int i = 0; i < s.size(); ++i)
        if (raws[i] >= 'A' && raws[i] <= 'Z')
            s[i] = '0';
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < s.size(); ++j)
            if (raws[j] == q[i])
                s[j] = '1' - s[j] + '0';
        t = 0;
        cout << expresie();
    }
    return 0;
}