Cod sursa(job #2652680)

Utilizator gasparrobert95Gaspar Robert Andrei gasparrobert95 Data 25 septembrie 2020 15:08:06
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
map <char, bool> mp;
int n, p;
string s;

bool _and();
bool termen();

bool _or() {
    bool r = _and();
    while (s[p] == 'o') {
        ++p;
        r = r or _and();
    }
    return r;
}

bool _and() {
    bool r = termen();
    while (s[p] == 'a') {
        ++p;
        r = r and termen();
    }
    return r;
}

bool termen() {
    bool r = false;
    if (s[p] == '(') {
        ++p;
        r = _or();
        ++p;
    }
    bool _not = false;
    if (s[p] == 'n') {
        _not = true;
        ++p;
    }
    if (s[p] == '1') {
        r = true;
        ++p;
    }
    else if (s[p] == '0')
        ++p;
    else if (s[p] >= 'A' && s[p] <= 'Z') {
        r = mp[s[p]];
        ++p;
    }
    if (_not)
        r = !r;
    return r;
}

void transforma() {
    for (p = 0; p < s.size(); ++p) {
        if (s[p] == ' ') {
            s.erase(p, 1);
            --p;
        }
        else if ((s[p] == 'N' && s[p + 1] == 'O' && s[p + 2] == 'T') || (s[p] == 'A' && s[p + 1] == 'N' && s[p + 2] == 'D')) {
            char first = s[p];
            s.erase(p, 3);
            if (first == 'N')
                s.insert(p, "n");
            else
                s.insert(p, "a");
            --p;
        }
        else if (s[p] == 'T' && s[p + 1] == 'R' && s[p + 2] == 'U' && s[p + 3] == 'E') {
            s.erase(p, 4);
            s.insert(p, "1");
            --p;
        }
        else if (s[p] == 'F' && s[p + 1] == 'A' && s[p + 2] == 'L' && s[p + 3] == 'S' && s[p + 4] == 'E') {
            s.erase(p, 5);
            s.insert(p, "0");
            --p;
        }
        else if (s[p] == 'O' && s[p + 1] == 'R') {
            s.erase(p, 2);
            s.insert(p, "o");
            --p;
        }
    }
    return;
}

int main() {
    getline(fin, s);
    transforma();
    transforma();
    fin >> n;
    while(n--) {
        char el;
        fin >> el;
        p = 0;
        if (mp[el] == false)
            mp[el] = true;
        else
            mp[el] = false;
        fout << _or();
    }
    return 0;
}