Cod sursa(job #2432201)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 22 iunie 2019 15:13:04
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");

int z, n, v[300], p = 0;
char e[2009];
string x;

int eval();

int eval2();

int eval3();

void idk()
{
    while (e[p] == ' ')
        ++p;
}

int eval()
{
    int r = eval2();
    while (e[p] == 'O' && e[p + 1] == 'R')
    {
        if (e[p + 3] == 'N' && e[p + 4] == 'O' && e[p + 5] == 'T')
        {
            p += 6;
            idk();
            r = r | !eval2();
        }
        else
        {
            p += 2;
            idk();
            r = r | eval2();
        }
    }
    return r;
}

int eval2()
{
    int r = eval3();
    while (e[p] == 'A' && e[p + 1] == 'N' && e[p + 2] == 'D')
    {
        if (e[p + 4] == 'N' && e[p + 5] == 'O' && e[p + 6] == 'T')
        {
            p += 7;
            idk();
            r = r & !eval3();
        }
        else
        {
            p += 3;
            idk();
            r = r & eval3();
        }
    }
    return r;
}

int eval3()
{
    int r;
    if (e[p] == '(')
    {
        ++p;
        r = eval();
        ++p;
        idk();
    }
    else if (e[p] == 'T' && e[p + 1] == 'R')
    {
        r = 1;
        p += 4;
        idk();
    }
    else if (e[p] == 'F' && e[p + 1] == 'A')
    {
        r = 0;
        p += 5;
        idk();
    }
    else if (e[p] >= 'A' && e[p] <= 'Z')
    {
        r = v[e[p]];
        ++p;
        idk();
    }
    return r;
}

int main()
{
    fin.get(e, 2001);
    fin >> n;
    fin >> x;
    for (int i = 1; i <= n; ++i)
    {
        v[x[i - 1]] = !v[x[i - 1]];
        p = 0;
        fout << eval();
    }
    fin.close();
    fout.close();
}