Cod sursa(job #1820063)

Utilizator tgm000Tudor Mocioi tgm000 Data 1 decembrie 2016 10:03:03
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include<cstdio>
char v[26];
char s[1001];
int poz=0;
int andt(int a,int b){
   if(a==1&&b==1)
      return 1;
   else
      return 0;
}
int ort(int a,int b){
   if(a==1||b==1)
      return 1;
   else
      return 0;
}
int expresie();
int factor();
int main(){
   int i,n;
   char c;
   freopen("bool.in","r",stdin);
   freopen("bool.out","w",stdout);
   c=fgetc(stdin);
   i=0;
   while(c!='\n'){
      if(c=='('||c==')'){
         s[i++]=c;
         c=fgetc(stdin);
      }else{
         if(c=='T'){
            c=fgetc(stdin);
            if(c=='R'){
               s[i++]='t';
               fgetc(stdin);
               fgetc(stdin);
               c=fgetc(stdin);
            }else
               s[i++]='T';
         }else if(c=='F'){
            c=fgetc(stdin);
            if(c=='A'){
               s[i++]='f';
               fgetc(stdin);
               fgetc(stdin);
               fgetc(stdin);
               c=fgetc(stdin);
            }else
               s[i++]='F';
         }else if(c=='N'){
            c=fgetc(stdin);
            if(c=='O'){
               s[i++]='n';
               fgetc(stdin);
               c=fgetc(stdin);
            }else
               s[i++]='N';
         }else if(c=='A'){
            c=fgetc(stdin);
            if(c=='N'){
               s[i++]='a';
               fgetc(stdin);
               c=fgetc(stdin);
            }else
               s[i++]='A';
         }else if(c=='O'){
            c=fgetc(stdin);
            if(c=='R'){
               s[i++]='o';
               c=fgetc(stdin);
            }else
               s[i++]='O';
         }else{
            s[i++]=c;
            c=fgetc(stdin);
         }
      }
      while(c==' ')
         c=fgetc(stdin);
   }
   scanf("%d\n",&n);
   for(i=1;i<=n;i++){
      c=fgetc(stdin);
      v[c-'A']=1-v[c-'A'];
      printf("%d",expresie());
   }
   return 0;
}
int expresie(){
   int ans=factor();
   while(s[poz]=='a'||s[poz]=='o'){
      poz++;
      if(v[poz-1]=='a')
         ans=andt(ans,factor());
      else
         ans=ort(ans,factor());
   }
   return ans;
}
int factor(){
   int ans=0;
   if(s[poz]=='('){
      poz++;
      ans=expresie();
      poz++;
   }else if(s[poz]=='n'){
      poz++;
      if(s[poz]=='('){
         poz++;
         ans=expresie();
         poz++;
      }else
         ans=expresie();
      ans=1-ans;
   }else if(s[poz]>='A'&&s[poz]<='Z')
      ans=v[s[poz]-'A'];
   else if(s[poz]=='t')
      ans=1;
   else
      ans=0;
   return ans;
}