Cod sursa(job #1208169)

Utilizator 2dorTudor Ciurca 2dor Data 14 iulie 2014 22:08:56
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
//pornim de la operatorul cu cea mai mica prioritate
//si rezolvam pe cei cu prioritate mai mare
ifstream fin("bool.in");
ofstream fout("bool.out");

string S, seq;
int N, it;
bool alphabet[200];
bool eval(), orEval(), andEval();

void Read() {
    getline(fin, S);
    for (int i = 0; i < S.length(); ++i)
        if (S[i] == ' ')
            S.erase(i, 1);
    fin >> N;
    fin >> seq;
}

bool eval() {
    bool r;
    if (S[it] == '(') {//paranteza
        ++it;
        r = orEval();
        ++it;
    }else if (S[it] == 'N' && S[it + 1] == 'O' && S[it + 2] == 'T') {//NOT
        it += 3;
        r = !eval();
    }else if (S[it] == 'F' && S[it + 1] == 'A' && S[it + 2] == 'L') {//FALSE
        it += 5;
        r = false;
    }else if (S[it] == 'T' && S[it + 1] == 'R') {//TRUE
        it += 4;
        r = true;
    }else {//variabila
        r = alphabet[ S[it] ];
        ++it;
    }
    return r;
}


bool andEval() {
    bool r = eval();
    while (S[it] == 'A' && S[it + 1] == 'N') {
        it += 3;
        r &= eval();
    }
    return r;
}

bool orEval() {
    bool r = andEval();
    while (S[it] == 'O' && S[it + 1] == 'R') {
        it += 2;
        r |= andEval();
    }
    return r;
}

void Solve() {
    for (int i = 0; i < N; ++i) {
        alphabet[ seq[i] ] ^= 1;
        it = 0;
        fout << orEval();
    }fout << '\n';
}

int main() {
    Read();
    Solve();
    fin.close();
    fout.close();
    return 0;
}