Cod sursa(job #2096344)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 28 decembrie 2017 23:11:47
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 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,q,i,r;
bool Or();
bool And();
bool Not();
bool element();
int main () {
    fin.get(ex,1000);
    for(i=0;ex[i]!=0;i++){
        if(ex[i]==' ')
            continue;
        if(i>=2&&ex[i]=='T'&&ex[i-1]=='O'&&ex[i-2]=='N'){
            d[++n]='!';
            continue;
        }
        if(i>=1&&ex[i]=='R'&&ex[i-1]=='O'){
            d[++n]='|';
            continue;
        }
        if(i>=2&&ex[i]=='D'&&ex[i-1]=='N'&&ex[i-2]=='A'){
            d[++n]='&';
            continue;
        }
        if(i>=3&&ex[i]=='E'&&ex[i-1]=='U'&&ex[i-2]=='R'&&ex[i-3]=='T'){
            d[++n]='1';
            continue;
        }
        if(i>=4&&ex[i]=='E'&&ex[i-1]=='S'&&ex[i-2]=='L'&&ex[i-3]=='A'&&ex[i-4]=='F'){
            d[++n]='0';
            continue;
        }
        if(ex[i]>='A'&&ex[i]<='Z'){
            if(ex[i+1]>='A'&&ex[i+1]<='Z')
                continue;
            d[++n]=ex[i];
            continue;
        }
        d[++n]=ex[i];
    }
    fin>>q;
    for(r=1;r<=q;r++){
        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=(val|And());
    }
    return val;
}
bool And(){
    bool val=Not();
    while(d[i]=='&'){
        i++;
        val=(val&Not());
    }
    return val;
}
bool Not(){
    if(d[i]=='!'){
        i++;
        return 1-element();
    }
    return element();
}
bool element(){
    bool val;
    if(d[i]=='('){
        i++;
        val=Or();
        i++;
        return val;
    }
    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;
}