Cod sursa(job #2711280)

Utilizator rARES_4Popa Rares rARES_4 Data 23 februarie 2021 21:12:45
Problema Bool Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <unordered_map>
#include <cstring>
using namespace std;
ifstream f ("bool.in");
ofstream g ("bool.out");
char expr[1001];
int l,n;
unordered_map<char,bool>Map;
stack<char>op;
stack<bool>nr;
void secventa()
{
    while(!op.empty() && op.top() != '(')
    {
        bool a = nr.top();
        nr.pop();
        char semn = op.top();
        op.pop();
        bool b;
        if(semn!='N')
        {
            b = nr.top();
            nr.pop();
        }
        if(semn == 'A')
        {
            nr.push(a&b);
        }
        else if (semn=='O')
        {
            nr.push(a|b);
        }
        else if (semn == 'N')
        {
            nr.push(!a);
        }
    }

}
int eval()
{
    for(int i = 0; i<l; i++)
    {
        if(expr[i] == '(')
            {
                op.push('(');
            }
        else if(expr[i] == ')')
        {
            secventa();
            op.pop();
        }
        else if (expr[i] == 'N' && expr[i+1] != 'T')
        {
            op.push('N');
            i+=2;
        }
        else if (expr[i] == 'A' && expr[i+1] == 'N')
        {
            if(!op.empty() && op.top() == 'N')
                secventa();
            op.push('A');
            i+=2;
        }
        else if (expr[i] == 'O' && expr[i+1] == 'R')
        {
            secventa();
            op.push('O');
            i++;
        }
        else if (expr[i] == 'T' && expr[i+1] == 'R')
        {
            nr.push(1);
            i+=3;
        }
        else if (expr[i] == 'F' && expr[i+1] == 'A')
        {
            nr.push(0);
            i+=3;
        }
        else if (isalpha(expr[i]))
        {
            nr.push(Map[expr[i]]);
        }
    }
    secventa();
}
int main()
{
    f.getline(expr,1000);
    l = strlen(expr);
    f >> n;
    for(int i = 0; i<n; i++)
    {
        char x;
        f >> x;
        Map[x] = !Map[x];
        eval();
        g << nr.top();
        nr.pop();
    }
}