Cod sursa(job #2699643)

Utilizator CatalinPangaleanuCatalin Pangaleanu CatalinPangaleanu Data 25 ianuarie 2021 12:37:10
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <fstream>
#include <stack>
#include <cstring>

using namespace std;

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

char s[1010], t[1010];

bool val[26];

stack<char> sign;
stack<int> num;

inline int Precedence(char ch)
{   if (ch=='!')
        return 3;
    if (ch=='&')
        return 2;
    return 1;
}

inline int Evaluate()
{   int j, i, x, y;
    memset(s, '\0', sizeof(s));
    j=-1;
    for (i=0;t[i];++i)
        if (t[i]>='A' && t[i]<='Z')
        {   s[++j]=val[t[i]-'A']+'0';
            s[++j]=' ';
        }
        else if (t[i]=='0' || t[i]=='1')
            {   s[++j]=s[i];
                s[++j]=' ';
            }
            else if (t[i]=='(')
                    sign.push('(');
                else if (t[i]==')')
                    {   while (sign.top()!='(')
                        {   s[++j]=sign.top();
                            sign.pop();
                        }
                        sign.pop();
                    }
                    else
                    {   while (!sign.empty() && sign.top()!='(' && Precedence(t[i])<=Precedence(sign.top()))
                        {   s[++j]=sign.top();
                            sign.pop();
                        }
                        sign.push(t[i]);
                    }
    while (!sign.empty())
    {   s[++j]=sign.top();
        sign.pop();
    }
    for (i=0;s[i];++i)
        if (s[i]=='0' || s[i]=='1')
            num.push(s[i]-'0');
        else if (s[i]!=' ')
                if (s[i]=='!')
                    num.top()=!num.top();
                else
                {   x=num.top();
                    num.pop();
                    y=num.top();
                    num.pop();
                    if (s[i]=='&')
                        num.push(x&y);
                    else
                        num.push(x|y);
                }
    x=num.top();
    num.pop();
    return x;
}

int main()
{   char ch;
    int j, i, Q;
    cin.getline(s, 1000);
    j=-1;
    for (i=0;s[i];++i)
        if (s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
            t[++j]='!', i+=2;
        else if (s[i]=='A' && s[i+1]=='N' && s[i+2]=='D')
                t[++j]='&', i+=2;
            else if (s[i]=='O' && s[i+1]=='R')
                    t[++j]='|', ++i;
                else if (s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E')
                        t[++j]='1', i+=3;
                    else if (s[i]=='F' && s[i+1]=='A' && s[i+2]=='L' && s[i+3]=='S' && s[i+4]=='E')
                            t[++j]='0', i+=4;
                        else if (s[i]!=' ')
                                t[++j]=s[i];
    cin>>Q;
    while (Q--)
    {   cin>>ch;
        ch-='A';
        val[ch]=!val[ch];
        cout<<Evaluate();
    }
    cin.close();
    cout.close();

    return 0;
}