Cod sursa(job #938940)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int n;
char s[1010], changes[105];
bool val[30];
int poz;
inline bool eval();
inline bool termen();
inline bool factor();
inline void Read()
{
ifstream f("bool.in");
f.getline(s+1, 1010);
f>>n;
f>>(changes+1);
f.close();
}
inline bool eval()
{
bool rez = termen(), aux;
while (s[poz] == 'O' && s[poz+1] == 'R' && s[poz+1])
{
poz+=3;
aux = termen();
rez = rez || aux;
}
return rez;
}
inline bool termen()
{
bool rez = factor(), aux;
while (s[poz] == 'A' && s[poz+1] == 'N')
{
poz+=4;
aux = factor();
rez = rez && aux;
}
return rez;
}
inline bool factor()
{
if (s[poz] == 'T' && s[poz+1] == 'R')
{
poz += 5;
return true;
}
if (s[poz] == 'F' && s[poz+1] == 'A')
{
poz += 6;
return false;
}
if (s[poz] >= 'A' && s[poz] <= 'Z' && !(s[poz+1] >= 'A' && s[poz+1] <= 'Z'))
{
bool rez = val [s[poz] - 'A' + 1];
poz++;
while (s[poz] == ' ')
poz++;
return rez;
}
if (s[poz] == 'N' && s[poz+1] == 'O')
{
poz += 4;
return !factor();
}
/// daca am ajuns aici inseamna ca am paranteza
int rez;
poz++;
rez = eval();
poz++;
while(s[poz] == ' ')
poz++;
return rez;
}
inline void Solve()
{
int i;
bool rez;
ofstream g ("bool.out");
for (i=1; i<=n; i++)
{
val[changes[i] - 'A' + 1] = !val[changes[i] - 'A' + 1];
poz = 1;
rez = eval();
if (rez)
g<<1;
else
g<<0;
}
g<<"\n";
g.close();
}
int main()
{
Read();
Solve();
return 0;
}