Cod sursa(job #428304)

Utilizator vlad_DVlad Dumitriu vlad_D Data 29 martie 2010 09:37:34
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
#include <string>
#include <iostream>

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

int eval(int a, int b) {
    //2 parti
    int p = 0;
    int rez = -1;
    if (exp[a] == ' ') return eval(a+1, b);
    if (exp[b] == ' ') return eval(a, b-1);

    for (int i = b; i >= a; --i) {
        if (exp[i] == '(') {p++;continue;}
        if (exp[i] == ')') {p--;continue;}
        if (exp[i] == ' ') continue;
        if (p == 0 && exp[i] == 'O' && (i + 1 <= b && exp[i+1] == 'R')) 
            return eval(a, i - 1) || eval(i+2, b);
        if (p == 0 && exp[i] == 'A' && (i+1 <= b && exp[i+1] == 'N'))
            return eval(a, i - 1) && eval(i+3, b);
    }
    
    if (exp[a] == '(') return eval(a+1, b-1);
    if (exp[a] == 'T' && (a+1 <= b && exp[a+1] == 'R')) return 1;
    if (exp[a] == 'F' && (a+1 <= b && exp[a+1] == 'A')) return 0;
    if (exp[a] == 'N' && (a+1 <= b && exp[a+1] == 'O')) return !eval(a+3, b);
    return val[exp[a]-'A'];
}
int main() {
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    char exp2[1024];

    cin.getline(exp2, 1024);
    string line = exp2;
    for (int i = 0; i < line.size(); ++i) if (line[i] != ' ') {
        exp += line[i];
    }

    n = exp.size();
    int m;
    scanf("%d", &m);
    string linie;
    cin >> linie;

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