Cod sursa(job #3367909)

Utilizator GDARIUSGHIUTA DARIUS VALENTIN GDARIUS Data 12 octombrie 2026 01:21:37
Problema Bool Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.8 kb
#include <fstream>
#include <map>
#include <cstring>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
map <char,bool> val;
char s[1005],cmodif;
string v[1005],q[1005],ver;
int ind,ret,n,i,tempo,mn;
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<<' '<<evalnot<<'\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;
    while (op=="AND")
    {
        ind++;
        evaland=(evaland&expror());
        op=variable();
        urc=ret;
    }
    ind-=urc;
    //cout<<"evaland afis "<<evaland<<'\n';
    return evaland;

}
bool expror()
{
    //cout<<"aici expror"<<' '<<ind<<' ';
    string op="";
    bool evalor=0;
    int urc=0;
    //cout<<"verific "<<ind<<' '<<v[ind]<<'\n';
    if (s[ind]=='('||v[ind]=="AND"||v[ind]=="NOT")
    {
        if (s[ind]=='(') {ind++; tempo=1;}
        evalor=exprnot();
        if (tempo==1) {ind++; tempo=0;}
        if (s[ind]==' ') ind++;
    }
    else
    {
        op=variable();
        evalor=0;
        urc=ret;
        //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;
    while (op=="OR")
    {
        ind++;
        //cout<<"verific "<<ind<<' '<<v[ind]<<'\n';
        if (s[ind]=='('||v[ind]=="AND"||v[ind]=="NOT")
        {
            v[ind]="";
            if (s[ind]=='(') {ind++; tempo=1;}
            evalor=evalor|exprnot();
            if (tempo==1) {ind++; tempo=0;}
            if (s[ind]==' ') ind++;
        }
        else
        {
            //cout<<"AL DOILEA ORRRR"<<' ';
            op=variable();
            urc=ret;
            //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';
        }
        op=variable();
        urc=ret;
    }
    ind-=urc;
    //cout<<"afisez evalor "<<evalor<<'\n';
    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);
for (i=0; i<strlen(s); i++)
{
    if (s[i]=='(') v[i]="(";
    if (s[i]==')') v[i]=")";
}
for (i=strlen(s); i>0; i--)
    if (s[i]=='R'&&s[i-1]=='O') {v[i]="OR"; mn=i;}
for (i=2; i<strlen(s); i++)
{
    if (s[i]=='T'&&s[i-1]=='O'&&s[i-2]=='N') v[i]="NOT";
    if (s[i]=='D'&&s[i-1]=='N'&&s[i-2]=='A') v[i]="AND";
}
for (i=strlen(s)-1; i>=mn; i--)
    if (v[i]!=""&&v[i-1]==""&&v[i]!="OR") v[i-1]=v[i];
for (i=0; i<mn; i++) v[i]="";
for (i=mn+3; i<strlen(s); i++)
{
    while (v[i]!="OR"&&i<strlen(s)) {v[i]=""; i++;}
    i+=2;
}
for (i=0; i<strlen(s); i++) q[i]=v[i];
//for (i=0; i<strlen(s); i++)
    //cout<<i<<' '<<v[i]<<'\n';
//cout<<mn<<'\n';
cin>>n;
for (i=1; i<=n; i++)
{
    cin>>cmodif;
    val[cmodif]=!val[cmodif];
    ind=0;
    for (int j=0; j<strlen(s); j++) v[j]=q[j];
    cout<<exprnot();
}
    return 0;
}