Cod sursa(job #703576)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 2 martie 2012 12:56:43
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 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;
    if(e[c] == '!') {
        ++c;
        return !f4();
    }
    else
        return f4();

}

int f4() {

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



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