Cod sursa(job #2561192)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 28 februarie 2020 17:30:54
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 5.3 kb
#include <fstream>
#include <cstring>
#include <stack>

using namespace std;

ifstream f("bool.in");
ofstream g("bool.out");

struct s
{
    int poz;
    char semn, semn1;
};
s stiva[501];

int n, lg, nrv, nrs;
char c[1001], x;
bool val[26];
pair < bool, char > v[501];

bool rezolva(int st, int dr)
{
    nrv = nrs = 0;
    char semn = 0, semn1 = 0;
    for (int i = st; i <= dr; i++)
    {
        if (c[i] >= 'A' && c[i] <= 'Z')
        {
            if (c[i+1] == ' ' || c[i+1] == 0)
            {
                /*for (int j=1; j<nrv; j++)
                 {
                     g << v[j].first << " ";
                     if (v[j].second)
                        g << v[j].second << " ";
                     else
                        g << "X ";
                 }
                 g << v[nrv].first << " ";
                 if (semn)
                    g << semn << " ";
                 else
                    g << "X ";
                 g << val[c[i] - 'A'] << "\n";*/

                if (semn == 0)
                {
                    nrv++;
                    v[nrv].first = val[c[i] - 'A'];
                    v[nrv].second = semn;
                }
                else if (semn == '&')
                    v[nrv].first = (v[nrv].first && val[c[i] - 'A']);
                else if (semn == '|')
                    v[nrv].first = (v[nrv].first || val[c[i] - 'A']);
                else if (semn == '!')
                {
                    if (semn1 == '&')
                        v[nrv].first = (v[nrv].first && !val[c[i] - 'A']);
                    else if (semn1 == '|')
                        v[nrv].first = (v[nrv].first || !val[c[i] - 'A']);
                }
            }
            else
            {
                if (c[i] == 'A')
                {
                    semn1 = semn;
                    semn = '&';
                    i += 2;
                }
                else if (c[i] == 'O')
                {
                    semn1 = semn;
                    semn = '|';
                    i += 1;
                }
                else if (c[i] == 'N')
                {
                    semn1 = semn;
                    semn = '!';
                    i += 2;
                }
                else if (c[i] == 'T')
                {
                    if (semn == 0)
                    {
                        nrv++;
                        v[nrv].first = 1;
                        v[nrv].second = semn;
                    }
                    else if (semn == '&')
                        v[nrv].first = (v[nrv].first && 1);
                    else if (semn == '|')
                        v[nrv].first = (v[nrv].first || 1);
                    else if (semn == '!')
                    {
                        if (semn1 == '&')
                            v[nrv].first = (v[nrv].first && 0);
                        else if (semn1 == '|')
                            v[nrv].first = (v[nrv].first || 0);
                    }

                    i += 3;
                }
                else if (c[i] == 'F')
                {
                    if (semn == 0)
                    {
                        nrv++;
                        v[nrv].first = 0;
                        v[nrv].second = semn;
                    }
                    else if (semn == '&')
                        v[nrv].first = (v[nrv].first && 0);
                    else if (semn == '|')
                        v[nrv].first = (v[nrv].first || 0);
                    else if (semn == '!')
                    {
                        if (semn1 == '&')
                            v[nrv].first = (v[nrv].first && 1);
                        else if (semn1 == '|')
                            v[nrv].first = (v[nrv].first || 1);
                    }

                    i += 4;
                }
            }
        }
        else if (c[i] == '(')
        {
            nrs++;
            stiva[nrs].poz = nrv + 1;
            stiva[nrs].semn = semn;
            stiva[nrs].semn1 = semn1;
            semn = 0;
        }
        else if (c[i] == ')')
        {
            if (stiva[nrs].poz != nrv)
            {
                if (stiva[nrs].semn == '&')
                    v[nrv - 1].first = (v[nrv - 1].first && v[nrv].first);
                else if (stiva[nrs].semn == '|')
                    v[nrv - 1].first = (v[nrv - 1].first || v[nrv].first);
                else
                {
                    if (stiva[nrs].semn1 == '&')
                        v[nrv - 1].first = (v[nrv - 1].first && !v[nrv].first);
                    else if (stiva[nrs].semn1 == '|')
                        v[nrv - 1].first = (v[nrv - 1].first || !v[nrv].first);
                }
                nrv--;
            }
            nrs--;
        }
    }

    for (int i=2; i<=nrv; i++)
        if (v[i].second == '&')
            v[1].first = (v[1].first && v[i].first);
        else if (v[i].second == '|')
            v[1].first = (v[1].first || v[i].first);

    return v[1].first;
}

int main()
{
    f.getline(c, sizeof(c));
    lg = strlen(c);
    f >> n;
    while (n--)
    {
        f >> x;
        val[x - 'A'] = !val[x - 'A'];
        g << rezolva(0, lg - 1);
    }
    return 0;
}