Cod sursa(job #2870355)

Utilizator justin.stoicaJustin Stoica justin.stoica Data 12 martie 2022 11:54:43
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <fstream>
using namespace std;
string s;
bool value[30];
ifstream cin("bool.in");
ofstream cout("bool.out");
void parse(void) {
    char ch;
    cin.get(ch);
    while (ch != '\n') {
        if (ch == ' ') {
            cin.get(ch);
            continue;
        }
        if (ch >= 'A' && ch <= 'Z')
        {
            char last = ch;
            cin.get(ch);
            if (ch == ' ' || ch == '\n' || ch == ')' || ch == '(') {
                s += last;
                continue;
            }
            else {
                if (last == 'A') {
                    s += '&';
                    cin.get(ch);
                }
                if (last == 'N') {
                    s += '!';
                    cin.get(ch);
                }
                if (last == 'O') {
                    s += '|';
                }
                if (last == 'T') {
                    s += '1';
                    cin.get(ch);
                    cin.get(ch);
                }
                if (last == 'F') {
                    s += '0';
                    cin.get(ch);
                    cin.get(ch);
                    cin.get(ch);
                }
            }
        }
        if (ch == ')') {
            s += ')';
        }
        if (ch == '(') {
            s += '(';
        }
        cin.get(ch);
    }

}
int last = 0;
bool findDigit();
bool solveNotFactor();
bool solveAndFactor();
bool solveOrFactor();
int main()
{
    parse();
    int n;
    cin >> n;
    string changes;
    cin >> changes;
    for (int i = 0; i < n; i++) {
        value[changes[i] - 'A'] = !value[changes[i] - 'A'];
        last = 0;
        bool ans = solveOrFactor();
        cout << ans;
    }
    return 0;
}
bool findDigit(){
    if(s[last] >= 'A' && s[last] <= 'Z'){
        bool curr = value[s[last++] - 'A'];
        return curr;
    }
    else if(s[last] =='1' || s[last] == '0'){
        bool curr = s[last++] - '0';
        return curr;
    }
    if(s[last] == '('){
       last++;
        bool curr = solveOrFactor();
        return curr;
    }
}
bool solveNotFactor(){
    bool inv = false;
    while(last < s.size() && s[last] == '!'){
        inv = !inv;
        last++;
    }
    bool curr = findDigit();
    if(inv == true){
        curr = !curr;
    }
    return curr;
}
bool solveAndFactor(){
    bool curr = solveNotFactor();
    while(last < s.size() && s[last] == '&'){
        last++;
        curr &= solveNotFactor();
    }
    return curr;
}
bool solveOrFactor(){
    bool curr = solveAndFactor();
    while(last < s.size() && s[last] == '|'){
        last++;
        curr |= solveAndFactor();
    }
    last++;
    return curr;
}