Cod sursa(job #2511458)

Utilizator hunting_dogIrimia Alex hunting_dog Data 18 decembrie 2019 23:40:23
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.03 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <queue>

#define NMAX 1001

using namespace std;


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

class ExpresionEvaluator
{
private:
    const int INF=1e9;
    int res;
    stack <char> s;
    queue <char> q;

    int priorities[255]={0};
    bool var[26]={0};

    int getRes(int x,int y,char op)
    {
        if(x=='1')
            x=1;
        else
            x=0;

        if(y=='1')
            y=1;
        else
            y=0;

        switch(op)
        {
        case '|':
            return (x || y);
        case '&':
            return (x && y);
        case '~':
            return (!x);
        }
    }

    bool isVar(char c)
    {
        return (c<='Z' && c>='A');
    }

    void buildPostfix(char *v)
    {
        char *p=v;
        while(*p!='\0')
        {
            if(isVar(*p))
                q.push(*p);
            else if(*p=='1' || *p=='0')
                q.push(*p);
            else
                {
                if(*p=='(')
                    s.push(*p);
                else if(*p==')')
                {
                    while(s.top()!='(')
                       {
                        q.push(s.top());
                        s.pop();
                       }
                    s.pop();

                }
                else
                {
                    while(!s.empty() && priorities[s.top()]>=priorities[*p] && s.top()!=*p)
                    {
                        q.push(s.top());
                        s.pop();
                    }
                    s.push(*p);
                }
                }
            ++p;
        }
        while(!s.empty())
        {
            q.push(s.top());
            s.pop();
        }
    }

public:

    void updateValue(char c)
    {
        var[c-'A']=!var[c-'A'];
        res=INF;
    }

    int evaluate()
    {
        if(res!=INF)
            return res;
        queue <char> temp=q;
        while(!q.empty())
        {
            if(isVar(q.front()))
                s.push(var[q.front()-'A']+'0');
            else if(q.front()=='1' || q.front()=='0')
                s.push(q.front());
            else if(q.front()=='~')
            {
                int x=s.top();
                s.pop();
                s.push(getRes(x,'0',q.front())+'0');
            }
            else
            {
                int y=s.top();
                s.pop();
                int x=s.top();
                s.pop();
                s.push(getRes(x,y,q.front())+'0');
            }

            q.pop();
        }
        res=s.top()-'0';
        s.pop();

        q=temp;

        return res;
    }

    void printPostfix()
    {
        queue <char>e=q;
        while(!e.empty())
        {
            cout<<e.front()<<' ';
            e.pop();
        }
        cout<<'\n';
    }

    ExpresionEvaluator(char *v)
    {
        res=INF;
        priorities['|']=1;
        priorities['&']=2;
        priorities['~']=3;

        buildPostfix(v);

    }
};



int main()
{
    char v[NMAX];
    f.get(v,NMAX);
    char s[NMAX];
    int k=0;

    for(int i=0;v[i]!='\0';i++)
    {
        if(v[i]=='(')
            s[k++]=v[i];
        else if(v[i]==')')
            s[k++]=v[i];
        else if(v[i+1]==' ' || v[i+1]=='\0' || v[i+1]==')')
            s[k++]=v[i];
        else
        {
            if(v[i]=='A')
                s[k++]='&',i+=2;
            else if(v[i]=='O')
                s[k++]='|',++i;
            else if(v[i]=='N')
                s[k++]='~',i+=2;
            else if(v[i]=='F')
                s[k++]='0',i+=4;
            else if(v[i]=='T')
                s[k++]='1',i+=3;
        }

    }
    s[k]='\0';
    ExpresionEvaluator exp(s);

    exp.printPostfix();

    int n;
    f>>n;
    while(n--)
    {
        char c;
        f>>c;
        exp.updateValue(c);
        g<<exp.evaluate();
    }

    return 0;
}