Cod sursa(job #707959)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 6 martie 2012 09:52:08
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;


string x, e;
bool val[500];
int c, n;

int f1();
int f2();
int f3();
int f4();

int f1() {
    int sol;
    sol = f2();
    while(e[c] == '|') {
        ++c;
        sol = sol | f2();
    }
    return sol;
}

int f2() {
    int sol;
    sol = f3();
    while(e[c] == '&') {
        ++c;
        sol = sol & f3();
    }
    return sol;
}

int f3() {
    int sol = 0;
    while(e[c] == '!') {
        ++c;
        sol = 1 - sol;
    }
    if (sol == 1) {
        return !f4();
    }
    else {
        return f4();
    }
}

int f4() {
    if(e[c] == '(') {
       ++c;
       int rez = f1();
       ++c;
       return rez;
    }
    ++c;
    return val[e[c - 1]];
}

int main()
{
    char ch;
    int i;
    freopen ("bool.in", "r", stdin);
    freopen ("bool.out", "w", stdout);
    getline(cin, x);
    for(i = 0; i < x.size();) {
        if(x[i] == 'N' && x[i + 1] == 'O') {
            e.push_back('!');
            i += 3;
        }
        else if(x[i] == 'A' && x[i + 1] == 'N') {
            e.push_back('&');
            i += 3;
        }
        else if(x[i] == 'O' && x[i + 1] == 'R') {
            e.push_back('|');
            i += 2;
        }
        else if(x[i] == 'T' && x[i + 1] == 'R') {
            e.push_back('1');
            i += 4;
        }
        else if(x[i] == 'F' && x[i + 1] == 'A') {
            e.push_back('0');
            i += 5;
        }
        else if(x[i] == '(' || x[i] == ')') {
            e.push_back(x[i]);
            ++i;
        }
        else if(x[i] != ' ') {
            e.push_back(x[i]);
            ++i;
        }
        else {// spatiu
            ++i;
        }
    }
    cerr << e;
    val['0'] = 0;
    val['1'] = 1;
    scanf("%d\n", &n);
    for(i = 1; i <= n; ++i) {
        scanf("%c", &ch);
        val[ch] = 1 - val[ch];
        c = 0;
        printf("%d", f1());
    }
    printf("\n");
    return 0;
}