Cod sursa(job #2863593)

Utilizator Ana100Ana-Maria Tomoiala Ana100 Data 6 martie 2022 22:17:42
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.92 kb
#include <fstream>
#include <stack>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
string TRUE="TRUE";
string FALSE="FALSE";
string OR="OR";
string AND="AND";
string NOT="NOT";
int f[27];
string str;
int operation1(int val1, int val2, char operator1)
{
    //cout<<val1<<" "<<val2<<endl;
    if(operator1=='+')
        return val1 or val2;
    else if(operator1=='*')
        return val1 and val2;
}
int degree(char operator1)
{
    if(operator1=='+')
        return 1;
    else if(operator1=='*')
        return 2;
    else if(operator1=='!')
        return 3;
    return 0;
}
char form(int &i)
{
    string newstr;
    while(i<str.size() and str[i]>='A' and str[i]<='Z')
    {
        newstr.push_back(str[i]);
        i++;
    }
    i--;
    if(newstr==FALSE)
        return '0';
    else if(newstr==TRUE)
        return '1';
    else if(newstr==OR)
        return '+';
    else if(newstr==AND)
        return '*';
    else if(newstr==NOT)
        return '!';
    return str[i];
}
int eval(string &str)
{
    stack<int>val;
    stack<char>op;
    for(int i=0;i<str.size();i++)
    {
        //cout<<i<<endl;
        if(str[i]==' ')
            continue;
        else if(str[i]=='(')
        {
            op.push(str[i]);
        }
        else if(str[i]==')')
        {
            while(op.size()>0 and op.top()!='(')
            {
                char operator1=op.top();\
                op.pop();
                if(operator1=='!')
                {
                    int val1=val.top();
                    val.pop();
                    val.push(!val1);
                }
                else
                {
                    int val2=val.top();
                    val.pop();
                    int val1=val.top();
                    val.pop();
                    val.push(operation1(val1,val2,operator1));
                }
            }
            op.pop();
        }
        else if(str[i]>='A' and str[i]<='Z')
        {
            char x=form(i);
            //cout<<x<<endl;
            if(x=='0' or x=='1')
            {
                //cout<<"DA@";
                val.push(x-'0');
            }
            else if(x=='*' or x=='+' or x=='!')
                {
                    while(op.size()>0 and degree(op.top())>=degree(x))
                    {
                        char operator1=op.top();
                        op.pop();
                        if(operator1=='!')
                        {
                            int val1=val.top();
                            val.pop();
                            val.push(!val1);
                        }
                        else
                        {
                            int val2=val.top();
                            val.pop();
                            int val1=val.top();
                            val.pop();
                            val.push(operation1(val1,val2,operator1));
                        }
                    }
                    op.push(x);
                }
            else if(x>='A' and x<='Z')
            {
                //cout<<"DA";
                val.push(f[x-'A']);
            }
        }
    }
    while(op.size()>0)
    {
        char operator1=op.top();
        op.pop();
        if(operator1=='!')
        {
            int val1=val.top();
            val.pop();
            val.push(!val1);
        }
        else
        {
            int val2=val.top();
            val.pop();
            int val1=val.top();
            val.pop();
            val.push(operation1(val1,val2,operator1));
        }
    }
   // cout<<"!";
    return val.top();
}
int main()
{
    int n;
    getline(cin,str);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        char x;
        cin>>x;
        f[x-'A']^=1;
        //cout<<f[x-'A']<<endl;
        cout<<eval(str);
    }
    return 0;
}