Cod sursa(job #2561347)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 28 februarie 2020 19:02:42
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3 kb
#include <fstream>
#include <cstring>

using namespace std;

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

struct stiva
{
    int poz;
    char semn;
    bool NOT;
};

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

pair < bool, char > v[500];
stiva s[500];

bool rezolva(char c[])
{
    char semn = 0;
    bool NOT = false;
    int nrv = 0, nrs = 0;

    for (int i = 0; c[i]; 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')
                {
                    x = true;
                    i += 3;
                }
                else if (c[i] == 'F')
                {
                    x = false;
                    i += 4;
                }
                else
                    x = val[c[i] - 'A'];

                if (NOT)
                {
                    x = !x;
                    NOT = false;
                }

                if (semn == 0)
                {
                    nrv++;
                    v[nrv] = make_pair(x, 0);
                }
                else if (semn == '&')
                    v[nrv].first = (v[nrv].first && x);
                else if (semn == '|')
                {
                    nrv++;
                    v[nrv] = make_pair(x, '|');
                }
            }
            else if (c[i] == 'A')
            {
                semn = '&';
                i += 2;
            }
            else if (c[i] == 'O')
            {
                semn = '|';
                i += 1;
            }
            else if (c[i] == 'N')
            {
                NOT = true;
                i += 2;
            }
        }
        else if (c[i] == '(')
        {
            nrs++;
            s[nrs].poz = nrv + 1;
            s[nrs].semn = semn;
            if (NOT)
            {
                s[nrs].NOT = true;
                NOT = false;
            }
            semn = 0;
        }
        else if (c[i] == ')')
        {
            for (int j = s[nrs].poz + 1; j <= nrv; j++)
                v[s[nrs].poz].first = (v[s[nrs].poz].first || v[j].first);
            nrv = s[nrs].poz;

            if (s[nrs - 1].poz != nrv)
            {
                if (s[nrs].semn == '&')
                {
                    v[nrv - 1].first = (v[nrv - 1].first && v[nrv].first);
                    nrv--;
                }
                else if (s[nrs].semn == '|')
                    v[nrv].second = s[nrs].semn;
            }

            nrs--;
        }

    for (int i = 2; i <= nrv; i++)
        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 >> lit;
        val[lit - 'A'] = !val[lit - 'A'];
        g << rezolva(c);
    }

    return 0;
}