Cod sursa(job #1496747)

Utilizator livliviLivia Magureanu livlivi Data 5 octombrie 2015 15:51:31
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include<cstdio>
#define LEN 1000
#define N 100
using namespace std;

char S[LEN+1];
char modificari[N+1];
bool val[27];


bool expresie(char* &s);

bool fact(char* &s){
    bool R;

    if (s[0]=='('){
        s++;
        R=expresie(s);
    }
    else
    if (s[0]=='1' ||s[0]=='0') R=s[0]-'0';
    else R=val[s[0]-'A'];

    s++;
    return R;
}

bool eval2(char* &s){
    bool R,sign=0;

    if (s[0]=='!'){
        s++;
        sign=1;
    }

    R=fact(s);
    return R^sign;
}

bool eval1(char* &s){
    bool T=eval2(s);
    bool R;

    R=T;
    while(s[0]=='&'){
        s++;
        T=eval2(s);
        R=(R&T);
    }

    return R;
}

bool expresie(char* &s){
    bool T=eval1(s);
    bool R;

    R=T;
    while(s[0]=='|'){
        s++;
        T=eval1(s);
        R=(R|T);
    }

    return R;
}


void trans(){
    int i,j;
    i=0;
    j=0;

    while(S[i]!='\n' &&S[i]!='\0'){
        if (S[i]==' ') i++;
        else
        if (S[i]=='A' &&S[i+1]=='N'){
            S[j]='&';
            j++;
            i+=3;
        }
        else
        if (S[i]=='O' &&S[i+1]=='R'){
            S[j]='|';
            j++;
            i+=2;
        }
        else
        if (S[i]=='N' &&S[i+1]=='O'){
            S[j]='!';
            j++;
            i+=3;
        }
        else
        if (S[i]=='T' &&S[i+1]=='R'){
            S[j]='1';
            j++;
            i+=4;
        }
        else
        if (S[i]=='F' &&S[i+1]=='A'){
            S[j]='0';
            j++;
            i+=5;
        }
        else {
            S[j]=S[i];
            j++;
            i++;
        }
    }

    S[j]='\0';
}


int main(){
    freopen ("bool.in","r",stdin);
    freopen ("bool.out","w",stdout);
    int n,i;
    char *s;

    gets(S);
    scanf ("%d\n",&n);
    gets(modificari);

    trans();
    for(i=0;i<n;i++){
        val[modificari[i]-'A']=(val[modificari[i]-'A']^1);
        s=S;
        modificari[i]=expresie(s)+'0';
    }

    puts(modificari);
    return 0;
}