Pagini recente » Cod sursa (job #2527424) | Istoria paginii runda/graf3/clasament | Statistici theo stana (thanax28) | Rating caut antidot pentru febra (Febra_OJI) | Cod sursa (job #1742079)
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 110
#define MAXLEN 1050
using namespace std;
char s[MAXLEN], changes[MAXN];
int n, val[30];
void citire()
{
gets(s);
scanf("%d\n", &n);
gets(changes);
}
int check(int st, int dr, char v[])
{
int par = 0;
int rez = 0;
for (int i = dr; i >= st; i--) {
if (s[i] == ')') par++;
else if (s[i] == '(') par--;
else if (par == 0) {
int ok = 1;
for (int ind = strlen(v)-1; ok && ind >= 0; ind--)
if (s[i] != v[ind])
ok = 0;
else
i--;
if (ok)
return i+1;
}
}
return -1;
}
int eval(int st, int dr)
{
if (st > dr)return 1;
int x;
if ((x = check(st, dr, "OR")) != -1)
return eval(st, x-2) | eval(x+3, dr);
else if ((x = check(st, dr, "AND")) != -1)
return eval(st, x-2) & eval(x+4, dr);
else if ((x = check(st, dr, "NOT")) != -1)
return !eval(x+4, dr);
else if (s[st] == '(' && s[dr] == ')')
return eval(st+1, dr-1);
else if ((x = check(st, dr, "TRUE")) != -1)
return 1;
else if ((x = check(st, dr, "FALSE")) != -1)
return 0;
else if (st == dr)
return val[s[st]-'A'];
else {
cerr << "ERROR";
}
}
int main()
{
freopen("bool.in", "r", stdin);
freopen("bool.out", "w", stdout);
citire();
for (int i = 0; i < n; i++)
{
val[changes[i]-'A'] = !val[changes[i]-'A'];
printf("%d", eval(0, strlen(s)-1));
}
return 0;
}