Cod sursa(job #1496280)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 4 octombrie 2015 18:01:18
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <stdio.h>
char fr[30],v[1000];
int k;
void verif(){
    if(k>=1)
        if(v[k]=='R'&&v[k-1]=='O'){
            k-=1;
            v[k]='|';
        }
    if(k>=2){
        if(v[k]=='D'&&v[k-1]=='N'&&v[k-2]=='A'){
            k-=2;
            v[k]='&';
        }
        if(v[k]=='T'&&v[k-1]=='O'&&v[k-2]=='N'){
            k-=2;
            v[k]='!';
        }
    }
    if(k>=3)
        if(v[k]=='E'&&v[k-1]=='U'&&v[k-2]=='R'&&v[k-3]=='T'){
            k-=3;
            v[k]=1;
        }
    if(k>=4)
        if(v[k]=='E'&&v[k-1]=='S'&&v[k-2]=='L'&&v[k-3]=='A'&&v[k-4]=='F'){
            k-=4;
            v[k]=0;
        }
}
int expr(int &i);
int term(int &i){
    int rez;
    if(v[i]==1||v[i]==0)
        rez=v[i];
    else
        if(v[i]=='!'){
            i++;
            if(v[i]=='('){
                i++;
                rez=1-expr(i);
            }
            else
                rez=1-fr[v[i]-'A'];
        }
        else
            rez=fr[v[i]-'A'];
    i++;
    return rez;
}
int expr(int &i){
    char semn='&';
    int rez=1;
    while(i<=k&&v[i]!=')'){
        if(v[i]!='('&&v[i]!=')'){
            if(semn=='&')
                rez=rez&term(i);
            else
                rez=rez|term(i);
            semn=v[i];
            i++;
        }
        else
            if(v[i]=='('){
                i++;
                if(semn=='&')
                    rez=rez&expr(i);
                else
                    rez=rez|expr(i);
                semn=v[i];
                i++;
            }
    }
    i++;
    return rez;
}
int main(){
    FILE *fin,*fout;
    fin=fopen("bool.in","r");
    fout=fopen("bool.out","w");
    int i=0,n,rez,j;
    char ch;
    ch=fgetc(fin);
    v[0]=ch;
    while(ch!='\n'){
        ch=fgetc(fin);
        if(ch=='('||ch==')'){
            k++;
            v[k]=ch;
        }
        else
            if(ch>='A'&&ch<='Z'){
                k++;
                v[k]=ch;
                verif();
            }
    }
    fscanf(fin,"%d\n",&n);
    for(i=1;i<=n;i++){
        ch=fgetc(fin);
        fr[ch-'A']=(fr[ch-'A']+1)%2;
        j=0;
        rez=expr(j);
        fprintf(fout,"%d",rez);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}