Pagini recente » Cod sursa (job #408413) | Cod sursa (job #326499) | Cod sursa (job #2840815) | Cod sursa (job #1641599) | Cod sursa (job #1473608)
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
const int NMax = 1005;
const int LMax = 30;
const string AND ("AND");
const string OR ("OR");
const string NOT ("NOT");
const string TRUE ("TRUE");
const string FALSE ("FALSE");
int k, pz;
char v[NMax];
char *p;
vector < int > l[LMax];
bool termen();
bool eval(){
bool r = termen();
if(*p == '+' || *p == '-'){
if(*p == '+'){
p++;
r = r && termen();
}
if(*p == '-'){
p++;
r = r || termen();
}
}
return r;
}
bool termen(){
bool r = 0;
if(*p == '('){
p++;
r = eval();
p++;
}
while(*p == '0' || *p == '1'){
r = (*p - '0');
p++;
}
return r;
}
void elimin(bool neg){
if(neg && v[pz] == '0'){
v[pz] = '1';
pz++;
return;
}
if(neg && v[pz] == '1'){
v[pz] = '0';
pz++;
return;
}
if(v[pz] == '('){
while(pz < k && v[pz] != ')'){
pz++;
if(neg &&v[pz] == '0'){
v[pz] = '1';
} else {
if(neg && v[pz] == '1'){
v[pz] = '0';
} else {
if(v[pz] == '('){
pz++;
elimin(neg);
} else {
if(v[pz] == '!'){
v[pz] = '$';
pz++;
elimin(!neg);
}
}
}
}
}
}
}
int main(){
int n, nt = 0;
bool ok = 1;
char c;
string s;
while(ok && fin >> s){
fin.get(c);
if(c == '\n'){
ok = 0;
}
for(int i = 0; i < s.size(); i++){
if(s.compare(i, 3, AND) == 0){
v[k++] = '+';
i += 2;
} else {
if(s.compare(i, 3, NOT) == 0){
v[k++] = '!';
i += 2;
nt++;
} else {
if(s.compare(i, 2, OR) == 0){
v[k++] ='-';
i += 1;
} else {
if(s[i] == ')' || s[i] == '('){
v[k++] = s[i];
} else {
if(s.compare(i, 4, TRUE) == 0){
v[k++] = '1';
i += 3;
} else {
if(s.compare(i, 5, FALSE) == 0){
v[k++] = '0';
i += 4;
} else {
l[s[i] - 'A'].push_back(k - nt);
v[k++] = '0';
}
}
}
}
}
}
}
}
while(pz < k){
if(v[pz] == '!'){
v[pz] = '$';
pz++;
elimin(1);
}
pz++;
}
int neg = 0;
for(int i = 0; i <= k - neg; i++){
while(v[i + neg] == '$'){
neg++;
}
v[i] = v[i + neg];
}
fin >> n;
for(int i = 1; i <= n; i++){
fin >> c;
nt = c - 'A';
for(int j = 0; j < l[nt].size(); j++){
if(v[l[nt][j]] == '1'){
v[l[nt][j]] = '0';
} else {
v[l[nt][j]] = '1';
}
}
p = v;
fout << eval();
}
return 0;
}