Pagini recente » Cod sursa (job #1649092) | Cod sursa (job #1549764) | Istoria paginii runda/kod_tesztel3/clasament | Cod sursa (job #2488269) | Cod sursa (job #2861854)
#include <fstream>
#include <bitset>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
const int NMAX = 1e3;
const int alfa = 1e2;
char expresie[NMAX + 5];
bitset <alfa> val;
int p, n;
bool eval();
bool AND();
bool NOT();
bool eval(){
bool x = AND();
while(expresie[p] == '|'){
p++;
bool t = AND();
x = x | t;
}
return x;
}
bool AND(){
bool x = NOT();
while(expresie[p] == '&'){
p++;
bool t = NOT();
x = x & t;
}
return x;
}
bool NOT(){
bool x = 0, semn = 0;
while(expresie[p] == '!')
semn = !semn, p++;
if(expresie[p] == '('){
p++;
x = eval();
p++;
if(semn)
return !x;
return x;
}
x = val[expresie[p++]];
if(semn)
return !x;
return x;
}
void parsare(){
int leftwall = 0, k = 0;
while(expresie[k]){
if(expresie[k] == 'A' && expresie[k + 1] == 'N'){
expresie[leftwall++] = '&';
k += 3;
}else if(expresie[k] == 'N' && expresie[k + 1] == 'O'){
expresie[leftwall++] = '!';
k += 3;
}else if(expresie[k] == 'O' && expresie[k + 1] == 'R'){
expresie[leftwall++] = '|';
k += 2;
}else if(expresie[k] == 'T' && expresie[k + 1] == 'R'){
expresie[leftwall++] = '1';
k += 4;
}else if(expresie[k] == 'F' && expresie[k + 1] == 'A'){
expresie[leftwall++] = '0';
k += 5;
}else if(expresie[k] != char(32))
expresie[leftwall++] = expresie[k++];
else k++;
}
expresie[leftwall] = '\0';
}
int main(){
cin.getline(expresie, NMAX + 1);
parsare();
val['1'] = 1;
cin >> n;
char ch;
for(int i = 0; i < n; i++){
cin >> ch;
val[ch] = !val[ch];
p = 0;
cout << eval();
}
}