Cod sursa(job #2652947)

Utilizator gasparrobert95Gaspar Robert Andrei gasparrobert95 Data 26 septembrie 2020 14:51:19
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.43 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 _or();
bool termen();

bool _and() {
    bool r = _or();
    while (s[p] == 'A' && s[p + 1] == 'N' && s[p + 2] == 'D') {
        p += 4;
        r = r and _or();
        ++p;
    }
    return r;
}

bool _or() {
    bool r = termen();
    while (s[p] == 'O' && s[p + 1] == 'R') {
        p += 3;
        r = r or termen();
        ++p;
    }
    return r;
}

bool termen() {
    bool r = false;
    if (s[p] == '(') {
        ++p;
        r = _and();
        ++p;
    }
    else {
        bool _not = false;
        if (s[p] == 'N' && s[p + 1] == 'O' && s[p + 2] == 'T') {
            _not = true;
            p += 4;
        }
        if (s[p] == 'T' && s[p + 1] == 'R' && s[p + 2] == 'U' && s[p + 3] == 'E') {
            r = true;
            p += 5;
        }
        if (s[p] == 'F' && s[p + 1] == 'A' && s[p + 2] == 'L' && s[p + 3] == 'S' && s[p + 4] == 'E')
            p += 6;
        if (s[p] >= 'A' && s[p] <= 'Z' && (s[p + 1] < 'A' || s[p + 1] > 'Z')) {
            r = mp[s[p]];
            p += 1;
        }
        if (_not)
            r = !r;
    }
    return r;
}

void introdu(int i) {
    if (s[i - 1] != ' ')
        s.insert(i, " ");
    return;
}

int main() {
    getline(fin, s);
    for (int i = 0; i < s.size(); ++i)
        if (s[i] == ' ') {
            s.erase(i, 1);
            --i;
        }
    for (int i = 1; i < s.size(); ++i) {
        if (s.substr(i, 3) == "NOT" || s.substr(i, 3) == "AND") {
            if (s[i + 3] != ' ')
                s.insert(i + 3, " ");
            introdu(i);
        }
        else if (s.substr(i, 2) == "OR") {
            if (s[i + 2] != ' ')
                s.insert(i + 2, " ");
            introdu(i);
        }
        else if (s.substr(i, 4) == "TRUE") {
            if (s[i + 4] != ' ')
                s.insert(i + 4, " ");
            introdu(i);
        }
        else if (s.substr(i, 5) == "FALSE") {
            if (s[i + 5] != ' ')
                s.insert(i + 5, " ");
            introdu(i);
        }
    }
    //cout << s;
    fin >> n;
    while(n--) {
        char el;
        fin >> el;
        p = 0;
        if (mp[el] == false)
            mp[el] = true;
        else
            mp[el] = false;
        fout << _and();
    }
    return 0;
}