Cod sursa(job #2581887)

Utilizator sipdavSipos David Oliver sipdav Data 15 martie 2020 22:38:45
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <bits/stdc++.h>

using namespace std;

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

int l, n, i;
bool val[27];
string e, s;

bool eval();
bool expresie();
bool var();

void read()
{
    string exp;
    getline(in, exp, '\n');
    int i = 0;
    l = exp.size();
    while(i < l)
    {
        string r = "";
        if(exp[i] != ' ' && exp[i] != '(' && exp[i] != ')')
        {
            while(exp[i] != ' ' && exp[i] != '(' && exp[i] != ')' && i < l)
            {
                r += exp[i];
                i++;
            }
            if(r != "")
            {
                if(r == "AND")
                    e += "&";
                else if(r == "OR")
                    e += "|";
                else if(r == "NOT")
                    e += "!";
                else if(r == "FALSE")
                    e += "0";
                else if(r == "TRUE")
                    e += "1";
                else
                    e += r;
            }
        }
        if(exp[i] != ' ')
        {
            e += exp[i];
            i++;
        }
        else
            i++;
    }
    l = e.size();
    in>>n;
    in>>s;
}

bool var()
{
    if(isalpha(e[i]))
    {
        char c = e[i];
        i++;
        return val[c - 'A' + 1];
    }
    if(e[i] == '1')
    {
        i++;
        return 1;
    }
    if(e[i] == '0')
    {
        i++;
        return 0;
    }
}

bool expresie()
{
    bool r;
    int nr = 0;
    while(e[i] == '!')
    {
        i++;
        nr++;
    }
    if(e[i] == '(')
    {
        i++;
        r = eval();
        i++;
        if(nr % 2)
            return !r;
        return r;
    }
    r = var();
    if(nr % 2)
        return !r;
    return r;
}

bool eval()
{
    bool r = expresie();
    while(e[i] == '&' || e[i] == '|')
    {
        if(e[i] == '&')
        {
            i++;
            r = r & expresie();
        }
        if(e[i] == '|')
        {
            i++;
            r = r | expresie();
        }
    }
    return r;
}

void solve()
{
    //out<<e<<'\n';
    for(int j = 0; j < n; j++)
    {
        val[s[j] - 'A' + 1] = !val[s[j] - 'A' + 1];
        i = 0;
        out<<eval();
    }
}

int main()
{
    read();
    solve();
    return 0;
}