Cod sursa(job #428379)

Utilizator vlad_DVlad Dumitriu vlad_D Data 29 martie 2010 10:35:19
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <cstdio>
#include <string>
#include <iostream>

using namespace std;
int n;
string expresie;
int val[56];
int eval2(string bul) {
    while (bul.size() > 1) {
        //find *
        int found = 0;
        for (int i = 1; i + 1 < bul.size(); ++i) if (bul[i] == '*') {
            found = 1;
            int val = 0;
            if (bul[i-1] == '1' && bul[i+1] == '1') val = 1;
            string doi = bul.substr(0, i - 1);
            if (val == 0) doi += "0";
            else doi += "1";
            doi += bul.substr(i + 2);
            bul = doi;
            break;
        }
        if (found) continue;
        break;

    }
    for (int i = 0; i < bul.size(); ++i) if (bul[i] == '1') return 1;
    return 0;
}
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'];

    string lst="";
    int ret = 1, op = 1, solved = 0;
    string bul = "1";
    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) bul+="*";
            else bul += "+";
            if (eval(lst)) bul += "1";
            else bul += "0";
            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) bul+="*";
            else bul+="+";
            if (eval(lst)) bul += "1";
            else bul += "0";
            solved = 1;
            op = 0; lst = ""; i++;continue;
        }
        lst += exp[i];
    }
    if (solved == 1) {
        if (op == 1) bul +="*";
        else bul += "+";
        if (eval(lst)) bul += "1";
        else bul += "0";
        return eval2(bul);
    }
    p = exp.size();
    if (exp[0] == 'N' && exp[1] == 'O') return !eval(exp.substr(3));
    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;
}