Cod sursa(job #2223829)

Utilizator NashikAndrei Feodorov Nashik Data 21 iulie 2018 17:06:52
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
//#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;
int V[105];
int f(char O[], int cnt)
{
    int S[1005], cnts = 0;

    for (int i = 0; i < cnt; ++ i) {
        if (('A' <= O[i]) and (O[i] <= 'Z'))
            S[cnts ++] = V[O[i]];
        else if ((O[i] == '0') or (O[i] == '1'))
            S[cnts ++] = O[i] - '0';
        else if (O[i] == '!')
            S[cnts - 1] ^= 1;
        else if (O[i] == '&')
            S[cnts - 2] = S[cnts - 2] & S[cnts - 1], cnts --;
        else if (O[i] == '|')
            S[cnts - 2] = S[cnts - 2] | S[cnts - 1], cnts --;
    }
    return S[0];
}

int main(void)
{
    char E[1005], S[1005], O[1005], ch;
    int n;

    int cnts, cnto, i, len;

    ifstream cin("bool.in");
    ofstream cout("bool.out");
    cin.getline(E, 1005);
    len = int(strlen(E));

    for (cnts = cnto = i = 0; i < len; ++ i) {
        if (E[i] == ' ')
            continue ;
        else if (E[i] == '(')
            S[cnts ++] = '(';
        else if (E[i] == ')') {
            while (S[cnts - 1] != '(')
                O[cnto ++] = S[-- cnts];
            cnts --;
        } else if (E[i] == 'O') {
            if (strncmp(&E[i], "OR", 2) == 0) {
                while ((cnts > 0) and ((S[cnts - 1] == '&') or (S[cnts - 1] == '!')))
                    O[cnto ++] = S[-- cnts];
                S[cnts ++] = '|', i += 1;
            } else
                O[cnto ++] = E[i];
        } else if (E[i] == 'A') {
            if (strncmp(&E[i], "AND", 3) == 0) {
                while ((cnts > 0) and (S[cnts - 1] == '!'))
                    O[cnto ++] = S[-- cnts];
                S[cnts ++] = '&', i += 2;
            } else
                O[cnto ++] = E[i];
        } else if (E[i] == 'N') {
            if (strncmp(&E[i], "NOT", 3) == 0)
                S[cnts ++] = '!', i += 2;
            else
                O[cnto ++] = E[i];
        } else if (E[i] == 'T') {
            if (strncmp(&E[i], "TRUE", 4) == 0)
                O[cnto ++] = '1', i += 3;
            else
                O[cnto ++] = E[i];
        } else if (E[i] == 'F') {
            if (strncmp(&E[i], "FALSE", 5) == 0)
                O[cnto ++] = '0', i += 4;
            else
                O[cnto ++] = E[i];
        } else
            O[cnto ++] = E[i];
    }
    while (cnts > 0)
        O[cnto ++] = S[-- cnts];



    for (cin >> n; n > 0; -- n)
        cin >> ch, V[ch] ^= 1, cout << f(O, cnto);
    return 0;
}