Cod sursa(job #3367905)

Utilizator GDARIUSGHIUTA DARIUS VALENTIN GDARIUS Data 11 octombrie 2026 23:10:01
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.93 kb
#include <fstream>
#include <map>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
map <char,bool> val;
char s[1005],cmodif;
int ind,ret,n,i;
bool prev,curr;
bool exprnot();
bool exprand();
bool expror();
string variable();
bool exprnot()
{
    //cout<<"aici exprnot intru"<<' '<<ind<<'\n';
    string op=variable();
    int urc=ret;
    bool evalnot=0;
    if (op=="NOT")
    {
        ind++;
        evalnot=!exprand();
    }
    else
    {
        ind-=urc;
        evalnot=exprand();
    }
    //cout<<"aici exprnot dupa and"<<' '<<ind<<'\n';
    return evalnot;
}
bool exprand()
{
    //cout<<"aici exprand intru"<<' '<<ind<<'\n';
    bool evaland=expror();
    //cout<<"aici exprand dupa or"<<' '<<ind<<'\n';
    string op=variable();
    int urc=ret;
    if (op=="AND")
    {
        ind++;
        evaland=(evaland&expror());
    }
    else ind-=urc;
    return evaland;

}
bool expror()
{
    //cout<<"aici expror"<<' '<<ind<<' ';
    string op="";
    bool evalor=0;
    int urc=0;
    if (s[ind]=='(')
    {
        ind++;
        evalor=exprnot();
        ind++;
        if (s[ind]==' ') ind++;
    }
    else
    {
        op=variable();
        evalor=0;
        urc=ret;
        if (op=="NOT")
        {
            ind-=urc;
            evalor=exprnot();
        }
        else
        {
            //cout<<op<<' '<<urc<<' '<<ind<<' ';
            if (op=="TRUE") evalor=1;
            else if (op=="FALSE") evalor=0;
            else if (urc==1) {//cout<<val[s[ind-1]];
            evalor=val[s[ind-1]];}
            //cout<<'\n';
        }
    }
    if (s[ind]==' ') ind++;
    op=variable();
    urc=ret;
    if (op=="OR")
    {
        ind++;
        if (s[ind]=='(')
        {
            ind++;
            evalor=evalor|exprnot();
            ind++;
            if (s[ind]==' ') ind++;
        }
        else
        {
            //cout<<"AL DOILEA ORRRR"<<' ';
            op=variable();
            urc=ret;
            if (op=="NOT")
            {
                ind-=urc;
                evalor=evalor|exprnot();
            }
            else
            {
                //cout<<op<<' '<<urc<<' '<<ind<<' ';
                if (op=="TRUE") evalor=1;
                else if (urc==1) {//cout<<val[s[ind-1]];
                evalor=evalor|val[s[ind-1]];}
                if (s[ind]==' ') ind++;
                //cout<<'\n';
            }
        }
    }
    else ind-=urc;
    return evalor;
}
string variable()
{
    //cout<<"aici variable"<<' '<<ind<<' ';
    string op="";
    int urc=0;
    while (s[ind]>='A'&&s[ind]<='Z')
    {
        op=op+s[ind];
        ind++; urc++;
    }
    ret=urc;
    //cout<<op<<' ';
    return op;
}
int main()
{cin.getline(s,1005);
cin>>n;
for (i=1; i<=n; i++)
{
    cin>>cmodif;
    val[cmodif]=!val[cmodif];
    ind=0;
    cout<<exprnot();
}
    return 0;
}