Cod sursa(job #1490457)

Utilizator mariusn01Marius Nicoli mariusn01 Data 23 septembrie 2015 16:47:19
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <fstream>

using namespace std;

ifstream fin ("bool.in");
ofstream fout("bool.out");

char s[1005], t[1005];
int i, k, n;
int F[130];
char c;

int expresieOr();
int expresieAnd();
int expresieXor();
int factor();

int expresieOr() {
    int r = expresieAnd();
    while (t[i] == '|') {
        i++;
        r = (r || expresieAnd());
    }
    return r;
}

int expresieAnd() {
    int r = expresieXor();
    while (t[i] == '&') {
        i++;
        r = (r && expresieXor());
    }
    return r;
}

int expresieXor() {
    int r = factor();
    while (t[i] == '^') {
        i++;
        int aux = factor();
        if (aux + r == 1)
            r = 1;
        else
            r = 0;
    }
    return r;
}

int factor() {
    int r;
    if (t[i] == '(') {
        i++;
        r = expresieOr();
        i++;
    } else {
        if (t[i] =='0') {
            i++;
            return 0;
        }

        if (t[i] == '1') {
            i++;
            return 1;
        }

        return F[ t[i++] ];
    }
    return r;
}

int main () {
    fin.get(s, 1002);
    fin.get();

    for (i=0;s[i]!=0;i++) {
        if (s[i] == ' ')
            continue;
        if (s[i] == '(' || s[i] == ')') {
            t[k++] = s[i];
            continue;
        }
        if (s[i] == 'T' && s[i+1] == 'R') {
            t[k++] = '1';
            i+=3;
            continue;
        }
        if (s[i]== 'F' && s[i+1] == 'A') {
            t[k++] = '0';
            i+=4;
            continue;
        }
        if (s[i] == 'O' && s[i+1] == 'R') {
            t[k++] = '|';
            i++;
            continue;
        }

        if (s[i]=='A' && s[i+1] == 'N') {
            t[k++] = '&';
            i+=2;
            continue;
        }

        if (s[i] == 'N' && s[i+1] == 'O') {
            t[k++] = '1';
            t[k++] = '^';
            i+=2;
            continue;
        }
        t[k++] = s[i];
    }

    fin>>n;
    for (int j=1;j<=n;j++) {
        fin>>c;
        //F[c] = !F[c];
        F[c] = 1 - F[c];
        i = 0;
        fout<<expresieOr();
    }


    return 0;
}