Cod sursa(job #2661697)

Utilizator Rares31100Popa Rares Rares31100 Data 22 octombrie 2020 15:47:41
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 5.8 kb
#include <bits/stdc++.h>

using namespace std;

//op: or - O, and - A, none - K
struct nod
{
    pair <bool, bool> elem = {false, false};
    pair <bool, bool> inv = {false, false};
    pair <int, int> next = {0, 0};
    char op = 'K';
}tree[1001];
int vf = 1, todo[1001];
vector <pair <int, int>> litere[26];
stack <int> stiva;

ifstream in("bool.in");
ofstream out("bool.out");
string sir;

int main()
{
    getline(in, sir);
    sir.push_back(' ');
    stiva.push(1);
    int i = 0;

    while(i < sir.size())
    {
        int toPlace = stiva.top();

        if(sir[i] == ' ')
        {
            i++;
        }
        if(isalpha(sir[i]) && !isalpha(sir[i+1]))
        {
            litere[sir[i]-'A'].push_back({toPlace, todo[toPlace] + 1});

            if(todo[toPlace] == 0)
                todo[toPlace]++;

            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();

            if(todo[stiva.top()] == 0)
                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)
                todo[toPlace]++;

            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)
    {
        for(auto 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;
}