Cod sursa(job #2271443)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 28 octombrie 2018 17:00:18
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>
#include <cstring>
using namespace std;

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

char c,s[1501],v[15001];
int val[1501];
int i,n,cnt;
int expresie(),termen(),factor();

int expresie(){
    int r=termen();
    while(v[i]=='|'){
        i++;
        r|=termen();
    }

    return r;
}

int termen(){
    int r=factor();
    while(v[i]=='&'){
        i++;
        r&=factor();
    }

    return r;
}

int factor(){
    int r;
    if(v[i]=='!'){
        i++;

        if(v[i]=='('){
            i++;
            r=expresie();
            i++;
        }else{
            r=val[v[i]];
            i++;
        }

        return 1-r;
    }else{
        if(v[i]=='('){
            i++;
            r=expresie();
            i++;
        }else{
            r=val[v[i]];
            i++;
        }

        return r;
    }
}

int main(){
    fin.get(s,1100);
    val['?']=1;
    for(i=0;i<strlen(s);i++){
        if(s[i]==' ')
            continue;
        if(s[i]=='N' && s[i+1]=='O'){
            v[++cnt]='!';
            i+=2;
            continue;
        }
        if(s[i]=='A' && s[i+1]=='N'){
            v[++cnt]='&';
            i+=2;
            continue;
        }
        if(s[i]=='O' && s[i+1]=='R'){
            v[++cnt]='|';
            i+=1;
            continue;
        }
        if(s[i]=='T' && s[i+1]=='R'){
            v[++cnt]='?';
            i+=3;
            continue;
        }
        if(s[i]=='F' && s[i+1]=='A'){
            v[++cnt]='%';
            i+=4;
            continue;
        }

        v[++cnt]=s[i];
    }
    /*
    for(i=1;i<=cnt;i++)
        fout<<v[i];
    fout<<"\n";
    */

    fin>>n;
    for(;n;n--){
        fin>>c;
        val[c]=1-val[c];
        i=1;
        fout<<expresie();
    }

    return 0;
}