Pagini recente » Borderou de evaluare (job #1254971) | Cod sursa (job #1969049)
#include <cstdio>
#include <cstring>
using namespace std;
int n, c[27], val, p;
char s1[1001], s[1001], x;
bool rewrite ()
{
int m = strlen (s1), j = 0;
for (int i=0; i<m; i++){
if (s1[i] == ')' || s1[i] == '('){
s[j] = s1[i];
i ++;
if (s[j] == ')' && s[j-2] == '('){
s[j-2] = s[j-1];
j -= 2;
}
}
else if (s1[i] >= 'A' && s1[i] <= 'Z' && (s1[i+1] <= 'A' || s1[i+1] >= 'Z')){
s[j] = s1[i];
i ++;
}
else if (s1[i] == 'T'){
s[j] = '1';
i += 4;
}
else if (s1[i] == 'F'){
s[j] = '0';
i += 5;
}
else if (s1[i] == 'N'){
s[j] = '~';
i += 3;
}
else if (s1[i] == 'A'){
s[j] = '&';
i += 3;
}
else if (s1[i] == 'O'){
s[j] = '|';
i += 2;
}
else {
j --;
i ++;
}
j ++;
i --;
}
s[j] = NULL;
}
int factor ();
int expresie ()
{
p ++;
int ans = factor ();
p ++;
return ans;
}
int element ()
{
int ans;
if (s[p] == '('){
ans = expresie ();
}
else if (s[p] == '0' || s[p] == '1'){
ans = s[p];
}
else{
ans = c[s[p] - 64];
}
p ++;
return ans;
}
int termen ()
{
int ans ;
if (s[p] == '('){
ans = expresie ();
}
else if (s[p] == '~'){
p ++;
ans = element ();
ans = (ans + 1) %2;
}
else{
ans = element ();
}
return ans;
}
int factor ()
{
int ans = termen (), ans2;
if (s[p] == '&'){
p ++;
ans2 = termen ();
ans &= ans2;
}
else if (s[p] == '|'){
p ++;
ans2 = termen ();
ans |= ans2;
}
return ans;
}
int main ()
{
freopen ("bool.in", "r", stdin);
freopen ("bool.out", "w", stdout);
gets (s1);
scanf ("%d ", &n);
rewrite ();
for (int i=1; i<=n; i++){
scanf ("%c", &x);
c[x - 64] = (c[x - 64] + 1) % 2;
p = 0;
printf ("%d", factor ());
}
return 0;
}