Pagini recente » Cod sursa (job #954200) | Cod sursa (job #840886) | Cod sursa (job #2383696) | Cod sursa (job #1865371) | Cod sursa (job #2661635)
#include <bits/stdc++.h>
using namespace std;
//op: or - O, and - A, none - K
struct nod
{
pair <bool, bool> elem;
pair <bool, bool> inv;
pair <int, int> next;
char op = 'K';
}tree[1001];
int vf = 1, todo[1001];
pair <int, int> litere[27];
stack <int> stiva;
ifstream in("bool.in");
ofstream out("bool.out");
string sir;
int main()
{
getline(in, sir);
sir += " ";
int i = 0;
stiva.push(1);
while(i < sir.size())
{
int toPlace = stiva.top();
if(sir[i] == ' ')
{
i++;
}
if(isalpha(sir[i]) && !isalpha(sir[i+1]))
{
litere[sir[i]-'A'] = {toPlace, todo[toPlace] + 1};
if(todo[toPlace] == 0)
{
tree[toPlace].elem.first = false;
todo[toPlace]++;
}
else
tree[toPlace].elem.second = false;
i++;
}
else if(sir[i] == 'N' && sir[i+1] == 'O')
{
if(todo[toPlace] == 0)
tree[toPlace].inv.first = true;
else
tree[toPlace].inv.second = true;
i += 3;
}
else if(sir[i] == 'A' && sir[i+1] == 'N')
{
tree[toPlace].op = 'A';
i += 3;
}
else if(sir[i] == 'O' && sir[i+1] == 'R')
{
tree[toPlace].op = 'O';
i += 2;
}
else if(sir[i] == '(')
{
vf++;
if(todo[toPlace] == 0)
tree[vf].next = {toPlace, 1};
else
tree[vf].next = {toPlace, 2};
stiva.push(vf);
i++;
}
else if(sir[i] == ')')
{
stiva.pop();
todo[stiva.top()]++;
i++;
}
else if(sir[i] == 'T' && sir[i+1] == 'R')
{
if(todo[toPlace] == 0)
{
tree[toPlace].elem.first = true;
todo[toPlace]++;
}
else
tree[toPlace].elem.second = true;
i += 4;
}
else if(sir[i] == 'F' && sir[i+1] == 'A')
{
if(todo[toPlace] == 0)
{
tree[toPlace].elem.first = false;
todo[toPlace]++;
}
else
tree[toPlace].elem.second = false;
i += 5;
}
}
tree[1].next = {0, 1};
for(int i = vf; i >= 1; i--)
{
int poz = tree[i].next.first;
if(tree[i].next.second == 1)
{
if(tree[i].op == 'K')
tree[poz].elem.first = (tree[i].inv.first ? !tree[i].elem.first : tree[i].elem.first);
else if(tree[i].op == 'A')
tree[poz].elem.first = (tree[i].inv.first ? !tree[i].elem.first : tree[i].elem.first) &&
(tree[i].inv.second ? !tree[i].elem.second : tree[i].elem.second);
else
tree[poz].elem.first = (tree[i].inv.first ? !tree[i].elem.first : tree[i].elem.first) ||
(tree[i].inv.second ? !tree[i].elem.second : tree[i].elem.second);
}
else
{
if(tree[i].op == 'K')
tree[poz].elem.second = (tree[i].inv.first ? !tree[i].elem.first : tree[i].elem.first);
else if(tree[i].op == 'A')
tree[poz].elem.second = (tree[i].inv.first ? !tree[i].elem.first : tree[i].elem.first) &&
(tree[i].inv.second ? !tree[i].elem.second : tree[i].elem.second);
else
tree[poz].elem.second = (tree[i].inv.first ? !tree[i].elem.first : tree[i].elem.first) ||
(tree[i].inv.second ? !tree[i].elem.second : tree[i].elem.second);
}
}
string change;
in >> change;
in >> change;
for(auto lit:change)
{
pair <int, int> poz2 = {litere[lit-'A']};
if(poz2.second == 1)
tree[poz2.first].elem.first = !tree[poz2.first].elem.first;
else
tree[poz2.first].elem.second = !tree[poz2.first].elem.second;
while(poz2.first != 0)
{
int i = poz2.first;
int poz = tree[i].next.first;
if(tree[i].next.second == 1)
{
if(tree[i].op == 'K')
tree[poz].elem.first = (tree[i].inv.first ? !tree[i].elem.first : tree[i].elem.first);
else if(tree[i].op == 'A')
tree[poz].elem.first = (tree[i].inv.first ? !tree[i].elem.first : tree[i].elem.first) &&
(tree[i].inv.second ? !tree[i].elem.second : tree[i].elem.second);
else
tree[poz].elem.first = (tree[i].inv.first ? !tree[i].elem.first : tree[i].elem.first) ||
(tree[i].inv.second ? !tree[i].elem.second : tree[i].elem.second);
}
else
{
if(tree[i].op == 'K')
tree[poz].elem.second = (tree[i].inv.first ? !tree[i].elem.first : tree[i].elem.first);
else if(tree[i].op == 'A')
tree[poz].elem.second = (tree[i].inv.first ? !tree[i].elem.first : tree[i].elem.first) &&
(tree[i].inv.second ? !tree[i].elem.second : tree[i].elem.second);
else
tree[poz].elem.second = (tree[i].inv.first ? !tree[i].elem.first : tree[i].elem.first) ||
(tree[i].inv.second ? !tree[i].elem.second : tree[i].elem.second);
}
poz2 = tree[i].next;
}
out << tree[0].elem.first;
}
return 0;
}