Pagini recente » Cod sursa (job #462920) | Cod sursa (job #334845) | Cod sursa (job #1003774) | Cod sursa (job #221270) | Cod sursa (job #2325087)
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin ("bool.in");
ofstream cout ("bool.out");
int i, x, q;
char ch;
char a[1005], p[1005];
string s;
string priority[3] = {"&|", "^", ""};
int op(int a, int b, char c) {
if(c == '&')
return a & b;
if(c == '^')
return a ^ b;
return a | b;
}
bool f1(string a, char c) {
for(int j = 0; j < a.size(); j++) {
if(a[j] == c)
return 1;
}
return 0;
}
int eval(int p) {
int nr = 0, nr2 = 0;
if(p == 2) {
if(s[i] == '(')
i++, nr = eval(0), i++;
else
nr = s[i] - '0', i++;
} else {
for(nr = eval(p + 1); f1(priority[p], s[i]) && i < s.size(); nr = nr2)
nr2 = op(nr, eval(p + 1), s[i++]);
}
return nr;
}
bool check(int c, int b, string s) {
if(b > x)
return 0;
for(int i = c; i <= b; i++) {
if(s[i - c] != a[i])
return 0;
}
return 1;
}
int main() {
cin.getline(a + 1, 1005, '\n');
x = strlen(a + 1);
for(int i = 1; i <= x; i++) {
if(a[i] == ' ')
continue;
if(check(i, i + 2, "NOT"))
s.push_back('1'), s.push_back('^'), i += 2;
else if(check(i, i + 2, "AND"))
s.push_back('&'), i += 2;
else if(check(i, i + 1, "OR"))
s.push_back('|'), i += 1;
else if(check(i, i + 3, "TRUE"))
s.push_back('1'), i += 3;
else if(check(i, i + 4, "FALSE"))
s.push_back('0'), i += 4;
else if('A' <= a[i] && a[i] <= 'Z')
s.push_back('0'), p[s.size() - 1] = a[i];
else
s.push_back(a[i]);
}
cin >> q;
for(; q; q--) {
cin >> ch;
for(int j = 0; j < s.size(); j++) {
if(p[j] == ch) {
if(s[j] == '1')
s[j] = '0';
else
s[j] = '1';
}
}
i = 0;
cout << eval(0);
}
return 0;
}