Pagini recente » Cod sursa (job #2193587) | Cod sursa (job #3266066) | Cod sursa (job #2954630) | Cod sursa (job #2493807) | Cod sursa (job #1208169)
#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;
}