Cod sursa(job #2744495)

Utilizator DragosC1Dragos DragosC1 Data 24 aprilie 2021 19:20:32
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.67 kb
#include <fstream>
#include <cstring>
#include <iostream>
using namespace std;

char s[1001], modific[105];
int n, ind, sz;
bool val[128];

void read() {
    ifstream f("bool.in");
    f.getline(s, 1001);
    f >> n; f.get();
    for (int i = 1; i <= n; i++)
        f >> modific[i];
    sz = strlen(s);
    f.close();
}

bool andop();
bool eval();
bool notop();
bool orop();

bool notop() {
    while (s[ind] == ' ')
        ind++;
    if (ind + 4 < sz && s[ind] == 'F' && s[ind + 1] == 'A' && s[ind + 2] == 'L' && s[ind + 3] == 'S' && s[ind + 4] == 'E') {
        ind += 4;
        return 1;
    }
    if (ind + 3 < sz && s[ind] == 'T' && s[ind + 1] == 'R' && s[ind + 2] == 'U' && s[ind + 3] == 'E') {
        ind += 3;
        return 0;
    }
    if (isalpha(s[ind]) && !isalpha(s[ind + 1])) 
        return 1 - val[s[ind]];
    if (s[ind] == '(') {
        ind++;
        return 1 - eval();
    }
}

bool andop() {
    while (s[ind] == ' ')
        ind++;
    if (ind + 4 < sz && s[ind] == 'F' && s[ind + 1] == 'A' && s[ind + 2] == 'L' && s[ind + 3] == 'S' && s[ind + 4] == 'E') {
        ind += 4;
        return 0;
    }
    if (ind + 3 < sz && s[ind] == 'T' && s[ind + 1] == 'R' && s[ind + 2] == 'U' && s[ind + 3] == 'E') {
        ind += 3;
        return 1;
    }
    if (isalpha(s[ind]) && !isalpha(s[ind + 1])) 
        return val[s[ind]];
    if (s[ind] == '(') {
        ind++;
        return eval();
    }
    if (ind + 2 < sz && s[ind] == 'N' && s[ind + 1] == 'O' && s[ind + 2] == 'T') {
        ind += 4;
        return notop();
    }
}

bool orop() {
    while (s[ind] == ' ')
        ind++;
    if (ind + 4 < sz && s[ind] == 'F' && s[ind + 1] == 'A' && s[ind + 2] == 'L' && s[ind + 3] == 'S' && s[ind + 4] == 'E') {
        ind += 4;
        return 0;
    }
    if (ind + 3 < sz && s[ind] == 'T' && s[ind + 1] == 'R' && s[ind + 2] == 'U' && s[ind + 3] == 'E') {
        ind += 3;
        return 1;
    }
    if (isalpha(s[ind]) && !isalpha(s[ind + 1])) 
        return val[s[ind]];
    if (s[ind] == '(') {
        ind++;
        return eval();
    }
    if (ind + 2 < sz && s[ind] == 'N' && s[ind + 1] == 'O' && s[ind + 2] == 'T') {
        ind += 4;
        return notop();
    }
}

bool eval() {
    int rez = 1;
    while (ind < sz) {
        while (s[ind] == ' ')
            ind++;
        if (ind + 3 < sz && s[ind] == 'T' && s[ind + 1] == 'R' && s[ind + 2] == 'U' && s[ind + 3] == 'E') {
            rez = 1;
            ind += 3;
        }
        else if (ind + 4 < sz && s[ind] == 'F' && s[ind + 1] == 'A' && s[ind + 2] == 'L' && s[ind + 3] == 'S' && s[ind + 4] == 'E') {
            rez = 0;
            ind += 4;
        }
        else if (isalpha(s[ind]) && !isalpha(s[ind + 1])) 
            rez = val[s[ind]];
        else if (s[ind] == '(') {
            ind++;
            rez = eval();
        }
        else if (ind + 2 < sz && s[ind] == 'N' && s[ind + 1] == 'O' && s[ind + 2] == 'T') {
            ind += 3;
            rez = notop();
        }
        else if (ind + 2 < sz && s[ind] == 'A' && s[ind + 1] == 'N' && s[ind + 2] == 'D') {
            ind += 3;
            rez = (andop() && rez);
        }
        else if (ind + 1 < sz && s[ind] == 'O' && s[ind + 1] == 'R') {
            ind += 2;
            rez = (orop() || rez);
        }
        else if (s[ind] == ')') 
            break;
        ind++;
    }
    return rez;
}

void solve() {
    int i;
    ofstream g("bool.out");
    for (i = 1; i <= n; i++) {
        val[modific[i]] = 1 - val[modific[i]];
        ind = 0;
        g << eval();
    }
    g.close();
}

int main() {
    read();
    solve();
    return 0;
}