Cod sursa(job #1507248)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 21 octombrie 2015 16:06:23
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
char v[1000];
int fr[101];
int n,k;
int expr();
int term();
int val();
/*  expr->term|...
    term->fact&...
    fact->[!]put
    put->val|(expr) */
int expr(){
    int rasp=term();
    while(v[k]=='|'&&k<=n){
        k++;
        rasp=rasp|term();
    }
    return rasp;
}
int term(){
    int rasp;
    rasp=val();
    while(v[k]=='&'&&k<=n){
        k++;
        rasp=rasp&val();
    }
    return rasp;
}
int val(){
    int rasp,nr=0;
    while(v[k]=='!'){
        k++;
        nr++;
    }
    if(v[k]>='A'&&v[k]<='Z')
        rasp=fr[v[k]-'A'];
    if(v[k]==0||v[k]==1)
        rasp=v[k];
    if(v[k]=='('){
        k++;
        rasp=expr();
        k++;
    }
    if(nr%2==1)
        rasp=(rasp+1)%2;
    return rasp;
}
inline void verificare(int &i){
    if(i>=1&&v[i]=='R'&&v[i-1]=='O'){
        i=i-1;
        v[i]='|';
    }
    if(i>=2&&v[i]=='T'&&v[i-1]=='O'&&v[i-2]=='N'){
        i=i-2;
        v[i]='!';
    }
    if(i>=2&&v[i]=='D'&&v[i-1]=='N'&&v[i-2]=='A'){
        i=i-2;
        v[i]='&';
    }
    if(i>=3&&v[i]=='E'&&v[i-1]=='U'&&v[i-2]=='R'&&v[i-3]=='T'){
        i=i-3;
        v[i]=1;
    }
    if(i>=4&&v[i]=='E'&&v[i-1]=='S'&&v[i-2]=='L'&&v[i-3]=='A'&&v[i-4]=='F'){
        i=i-4;
        v[i]=0;
    }
}
int main(){
    FILE *fin,*fout;
    fin=fopen("bool.in","r");
    fout=fopen("bool.out","w");
    int i,m;
    char ch;
    i=0;
    ch=fgetc(fin);
    v[i]=ch;
    i=1;
    while(ch!='\n'){
        ch=fgetc(fin);
        if(ch!=' '&&ch!='\n'){
            v[i]=ch;
            verificare(i);
            i++;
        }
    }
    n=i-1;
    fscanf(fin,"%d",&m);
    ch=fgetc(fin);
    for(i=1;i<=m;i++){
        ch=fgetc(fin);
        fr[ch-'A']=(fr[ch-'A']+1)%2;
        k=0;
        fprintf(fout,"%d",expr());
    }
return 0;
}