Cod sursa(job #2661635)

Utilizator Rares31100Popa Rares Rares31100 Data 22 octombrie 2020 14:02:04
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 5.85 kb
#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;
}