Cod sursa(job #2580867)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 14 martie 2020 12:01:37
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.23 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <stack>

using namespace std;

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

int n, lg;
char c[1001], lit;
int p[1001];
int v[1001];
bool val[26];

void paranteze()
{
    stack < int > stiva;
    for (int i = 0; c[i]; i++)
        if (c[i] == '(')
            stiva.push(i);
        else if (c[i] == ')')
        {
            p[stiva.top()] = i;
            stiva.pop();
        }
}

struct stv
{
    int poz, nr_not;
    char semn;
};

bool rezolva(int st, int dr)
{
    char semn = 0;
    int NR_NOT = 0;
    int nrv = 0;
    stack < stv > stiva;
    stv aux;

    for (int i = st; i <= dr; i++)
    {
        if (c[i] >= 'A' && c[i] <= 'Z')
        {
            if (c[i + 1] == ' ' || c[i + 1] == 0 || c[i + 1] == ')' || c[i] == 'T' || c[i] == 'F')
            {
                bool x;
                if (c[i] == 'T' && c[i+1] == 'R')
                {
                    x = true;
                    i += 3;
                }
                else if (c[i] == 'F' && c[i+1] == 'A')
                {
                    x = false;
                    i += 4;
                }
                else
                    x = val[c[i] - 'A'];

                if (NR_NOT)
                {
                    x = !x;
                    if (NR_NOT % 2)
                        x = !x;
                    NR_NOT = 0;
                }

                if (semn == 0 || semn == '|')
                {
                    nrv++;
                    v[nrv] = x;
                }
                else if (semn == '&')
                    v[nrv] = (v[nrv] && x);
            }
            else if (c[i] == 'A')
            {
                semn = '&';
                i += 2;
            }
            else if (c[i] == 'O')
            {
                semn = '|';
                i += 1;
            }
            else if (c[i] == 'N')
            {
                NR_NOT++;
                i += 2;
            }
        }
        else if (c[i] == '(')
        {
            aux.poz = nrv + 1;
            aux.nr_not = NR_NOT, NR_NOT = 0;
            aux.semn = semn, semn = 0;
            stiva.push(aux);
        }
        else if (c[i] == ')')
        {
            for (int j = stiva.top().poz + 1; j <= nrv; j++)
                v[stiva.top().poz] = (v[stiva.top().poz] || v[j]);
            nrv = stiva.top().poz;

            if (stiva.top().nr_not)
            {
                v[nrv] = !v[nrv];
                stiva.top().nr_not--;
                if (stiva.top().nr_not % 2)
                    v[nrv] = !v[nrv];
                stiva.top().nr_not = 0;
            }

            if (stiva.top().semn == '&')
            {
                v[nrv - 1] = (v[nrv - 1] && v[nrv]);
                nrv--;
            }

            stiva.pop();
        }
    }

    for (int i = 2; i <= nrv; i++)
        v[1] = (v[1] || v[i]);

    return v[1];
}

int main()
{
    f.getline(c, sizeof(c));
    lg = strlen(c);
    paranteze();

    f >> n;
    while (n--)
    {
        f >> lit;
        val[lit - 'A'] = !val[lit - 'A'];
        g << rezolva(0, lg - 1);
    }

    return 0;
}