Cod sursa(job #2790031)

Utilizator Ana100Ana-Maria Tomoiala Ana100 Data 28 octombrie 2021 13:00:46
Problema Bool Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 6.3 kb
#include <fstream>
#include <stack>

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

string str;

int f[50];
//stiu ca am scis-o urat, o sa o rescriu
int degree(int op)
{
    if(op=='!')
        return 3;
    else if(op=='&')
        return 2;
    else if(op=='+')
        return 1;
    return 0;
}

int calculatenot(int a, char op)
{
    if(op=='!')
        return !a;
}

int calculateoperation2(int a, int b, char op)
{
    if(op=='&')
        return a && b;
    else
        return a || b;
}

int evaluate(string str)
{
    stack<int>val;
    stack<char>op;
    for(int i=0;i<str.size();i++)
    {
        if(str[i]==' ')
            continue;
        else if(str[i]=='(')
        {
            op.push(str[i]);
        }
        else if(str[i]==')')
        {
            while(op.size()>0 and op.top()!='(')
            {
                //cout<<op.size()<<endl;
                char operation=op.top();
                op.pop();
                if(operation=='!')
                {
                    int val2=val.top();
                    calculatenot(val2,operation);
                }
                else
                {
                    int val2=val.top();
                    val.pop();
                    int val1=val.top();
                    val.pop();
                    val.push(calculateoperation2(val1,val2,operation));
                }
            }
            op.pop();
        }
        else if(str[i]>='A' and str[i]<='Z')
        {
            if(str[i]=='O' and str[i+1]>='A' and str[i+1]<='Z')
            {
                while(i<str.size() and str[i]>='A' and str[i]<='Z')
                {
                    i++;
                }
                char operation='+';
               // cout<<op.top()<<" "<<" "<<degree('(')<<" "<<degree(op.top())<<" "<<degree(operation)<<endl;
                while(op.size()>0 and degree(op.top())>=degree(operation))
               {
                if(op.top()=='!')
                {
                    int val1=val.top();
                    val.pop();
                    char operation=op.top();
                    op.pop();
                    val.push(calculatenot(val1,operation));
                    //cout<<val.top()<<endl;
                }
                else
                {
                    int val2=val.top();
                    val.pop();
                    int val1=val.top();
                    val.pop();
                    char operation=op.top();
                    op.pop();
                    val.push(calculateoperation2(val1,val2,operation));
                }
                }
                op.push('+');
               // cout<<i<<endl;
            }
            else if(str[i]=='A' and str[i+1]>='A' and str[i+1]<='Z')
            {
                while(i<str.size() and str[i]>='A' and str[i]<='Z')
                {
                    i++;
                }
                char operation='&';
                while(op.size()>0 and degree(op.top())>=degree(operation))
               {
                if(op.top()=='!')
                {
                    int val1=val.top();
                    val.pop();
                    char operation=op.top();
                    op.pop();
                    val.push(calculatenot(val1,operation));
                    //cout<<val.top()<<endl;
                }
                else
                {
                    int val2=val.top();
                    val.pop();
                    int val1=val.top();
                    val.pop();
                    char operation=op.top();
                    op.pop();
                    val.push(calculateoperation2(val1,val2,operation));
                }
                }
                op.push('&');
            }
            else if(str[i]=='N' and str[i+1]>='A' and str[i]<='Z')
            {
                while(i<str.size() and str[i]>='A' and str[i]<='Z')
                {
                    i++;
                }
                char operation='!';
                while(op.size()>0 and degree(op.top())>=degree(operation))
               {
                if(op.top()=='!')
                {
                    int val1=val.top();
                    val.pop();
                    char operation=op.top();
                    op.pop();
                    val.push(calculatenot(val1,operation));
                    //cout<<val.top()<<endl;
                }
                else
                {
                    int val2=val.top();
                    val.pop();
                    int val1=val.top();
                    val.pop();
                    char operation=op.top();
                    op.pop();
                    val.push(calculateoperation2(val1,val2,operation));
                }
                }
                op.push('!');
            }
            else if(str[i]=='F' and str[i+1]>='A' and str[i+1]<='Z')
            {
                while(i<str.size() and str[i]>='A' and str[i]<='Z')
                {
                    i++;
                }
                val.push(0);
            }
            else if(str[i]=='T' and str[i+1]>='A' and str[i+1]<='Z')
            {
                while(i<str.size() and str[i]>='A' and str[i]<='Z')
                {
                    i++;
                }
                val.push(1);
            }
            else
            {
                val.push(f[str[i]-'A']);
                i++;
            }
            i--;
        }
    }
    while(op.size()>0)
    {
        if(op.top()=='!')
        {
            int val1=val.top();
            val.pop();
            int operation=op.top();
            op.pop();
            val.push(calculatenot(val1,operation));
        }
        else
        {
        int val2=val.top();
        val.pop();
        int val1=val.top();
        val.pop();
        char operation=op.top();
        op.pop();
        val.push(calculateoperation2(val1,val2,operation));
        }
    }
    int ans=val.top();
    val.pop();
    return ans;
}
int main()
{
    int n;
    getline(cin,str);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        char c;
        cin>>c;
        f[c-'A']^=1;
        cout<<evaluate(str);
    }
    return 0;
}