Cod sursa(job #2096356)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 28 decembrie 2017 23:29:51
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
# include <fstream>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
bool f[26];
char ex[1010],d[1010],ch;
int n,r,i,q;
bool Or();
bool And();
bool el();
int main () {
    fin.get(ex,1000);
    for(i=0;ex[i]!=0;i++){
        if(ex[i]==' ')
            continue;
        if(ex[i]=='T'&&ex[i+1]=='R'){
            d[++n]='1';
            continue;
        }
        if(ex[i]=='F'&&ex[i+1]=='A'){
            d[++n]='0';
            continue;
        }
        if(ex[i]=='O'&&ex[i+1]=='R'){
            d[++n]='|';
            continue;
        }
        if(ex[i]=='A'&&ex[i+1]=='N'){
            d[++n]='&';
            continue;
        }
        if(ex[i]=='N'&&ex[i+1]=='O'){
            d[++n]='!';
            continue;
        }
        if(i>=1&&ex[i]>='A'&&ex[i]<='Z'&&ex[i-1]>='A'&&ex[i-1]<='Z')
            continue;
        d[++n]=ex[i];
    }
    fin>>r;
    for(q=1;q<=r;q++){
        fin>>ch;
        f[ch-'A']=1-f[ch-'A'];
        i=1;
        fout<<Or();
    }
    return 0;
}
bool Or(){
    bool val=And();
    while(d[i]=='|'){
        i++;
        val|=And();
    }
    return val;
}
bool And(){
    bool val=el();
    while(d[i]=='&'){
        i++;
        val&=el();
    }
    return val;
}
bool el(){
    bool val,Xor=0;
    while(d[i]=='!'){
        Xor=1-Xor;
        i++;
    }
    if(d[i]=='('){
        i++;
        val=Or();
        i++;
        return (val^Xor);
    }
    if(d[i]=='0')
        val=0;
    if(d[i]=='1')
        val=1;
    if(d[i]>='A'&&d[i]<='Z')
        val=f[d[i]-'A'];
    i++;
    return (val^Xor);
}