Cod sursa(job #428323)

Utilizator vlad_DVlad Dumitriu vlad_D Data 29 martie 2010 10:02:00
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <cstdio>
#include <string>
#include <iostream>

using namespace std;
int n;
string expresie;
int val[56];

int eval(string exp) {
    //2 parti
    int p = 0;
    if (exp == "TRUE") return 1;
    if (exp == "FALSE") return 0;
    if (exp.size() == 1) return val[exp[0]-'A'];
    if (exp[0] == 'N' && exp[1] == 'O') return !eval(exp.substr(3));

    string lst;
    int ret = 1, op = 1, solved = 0;
    for (int i = 0; i < exp.size(); ++i) {
        if (exp[i] == '(') {++p; lst += '(';  continue;}
        if (exp[i] == ')') {--p; lst += ')';  continue;}
        if (p == 0 && exp[i] == 'A' && (i+1 < exp.size() && exp[i+1] == 'N')) {
            if (op == 1) ret &= eval(lst);
            else ret |= eval(lst);
            solved = 1;
            op = 1; lst = "";i+=2;continue;
        } 
        if (p == 0 && exp[i] == 'O' && (i+1 < exp.size() && exp[i+1] ==
                    'R')) {
            if (op == 1) ret &= eval(lst);
            else ret |= eval(lst);
            solved = 1;
            op = 0; lst = ""; i++;continue;
        }
        lst += exp[i];
    }
    if (solved == 1) {
        if (op == 1) return ret&eval(lst);
        return ret|eval(lst);
    }
    p = exp.size();
    return eval(exp.substr(1, p - 2));

}
int main() {
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    char exp2[1024];
    gets(exp2);
    string line = exp2;
    for (int i = 0; i < line.size(); ++i) if (line[i] != ' ') {
        expresie += line[i];
    }

    int m;
    scanf("%d\n", &m);
    string linie;
    cin >> linie;

    for (int i = 0; i < linie.size(); ++i) {
        
        val[linie[i]-'A'] ^= 1;
        printf("%d", eval(expresie));
    }
    printf("\n");
    return 0;
}