Cod sursa(job #3196673)

Utilizator AlexanderCernyCernaianu Alexandru AlexanderCerny Data 24 ianuarie 2024 16:26:48
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.65 kb
/// Aceasta sursa este pentru problema
/// https://www.infoarena.ro/problema/bool
/// Punctaj: 100
/// Grupa de seniori - Clasa a X-a

#include <fstream>
#define DIM 1002

using namespace std;

ifstream fin ("bool.in");
ofstream fout("bool.out");

int n,i,j,pr[DIM/4],k1,k2;
char s[DIM],c;
int var[DIM];
char op[DIM];
int main()
{
    pr['n']=3;
    pr['o']=1;
    pr['a']=2;
    fin.getline(s,DIM);
    fin>>n;
    for(i=1;i<=n;i++)
    {
        fin>>c;
        pr[c]=1-pr[c];
        ///evaluam expresia
        k1=k2=0;
        for(j=0;s[j]!=0;j++)
            if(s[j]=='(')
                op[++k1]='(';
            else
                if(s[j]==')')
                {
                    while(op[k1]!='(')
                    {
                        if(op[k1]=='n')
                        {
                            var[k2]=1-var[k2];
                            k1--;
                        }
                        else
                            if(op[k1]=='a')
                            {
                                var[k2-1]=var[k2] && var[k2-1];
                                k2--;
                                k1--;
                            }
                            else
                            {
                                var[k2-1]=var[k2] || var[k2-1];
                                k2--;
                                k1--;
                            }
                    }
                    k1--;
                }
                else
                    if(s[j]=='N' && s[j+1]=='O')
                        op[++k1]='n',j+=2;
                    else
                        if(s[j]=='A' && s[j+1]=='N')
                        {
                            while(k1>0 && pr[op[k1]]>=pr['a'])
                            {
                                if(op[k1]=='n')
                                {
                                    var[k2]=1-var[k2];
                                    k1--;
                                }
                                else if(op[k1]=='a')
                                {
                                    var[k2-1]=var[k2] && var[k2-1];
                                    k2--;
                                    k1--;
                                }
                            }
                            op[++k1]='a';j+=2;
                        }
                        else
                            if(s[j]=='O' && s[j+1]=='R')
                            {
                                while(k1>0 && pr[op[k1]]>=pr['o'])
                                {
                                    if(op[k1]=='n')
                                    {
                                        var[k2]=1-var[k2];
                                        k1--;
                                    }
                                    else
                                        if(op[k1]=='a')
                                        {
                                            var[k2-1]=var[k2] && var[k2-1];
                                            k2--;
                                            k1--;
                                        }
                                        else
                                        {
                                            var[k2-1]=var[k2] || var[k2-1];
                                            k2--;
                                            k1--;
                                        }
                                }
                                op[++k1]='o';j++;
                            }
                            else
                            {
                                if(s[j]!=' ')
                                    if(s[j]=='T'&&s[j+1]=='R')
                                         var[++k2]=1,j+=3;
                                    else
                                        if(s[j]=='F'&& s[j+1]=='A')
                                              var[++k2]=0,j+=4;
                                    else
                                    var[++k2]=pr[s[j]];
                            }
        while(k1>0)
        {
            if(op[k1]=='n')
            {
                var[k2]=1-var[k2];
                k1--;
            }
            else if(op[k1]=='a')
            {
                var[k2-1]=var[k2] && var[k2-1];
                k2--;
                k1--;
            }
            else
            {
                var[k2-1]=var[k2] || var[k2-1];
                k2--;
                k1--;
            }
        }
        fout<<var[1];
    }
    return 0;
}