Cod sursa(job #2165919)

Utilizator herbertoHerbert Mohanu herberto Data 13 martie 2018 14:27:07
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1001


char s[MAXN], aux[MAXN];
int lit[30], p, n;

bool OR();
bool expr();
bool AND();

bool expr(){
  bool semn=0, val=0;
  if(s[p]=='('){
    p++;
    val=OR();
    p++;
  }
  else{
    if(s[p]=='1' || s[p]=='0'){
      val=s[p]-'0';
      p++;
    }
    else{
      if(s[p]=='!'){
        p++;
        val=1-expr();
      }
      else{
        val=lit[s[p]-'A'];
        p++;
      }
    }
  }
  return val;
}
bool AND(){
  bool val=expr();
  while(p<=n && s[p]=='&'){
    p++;
    val&=expr();
  }
  return val;
}

bool OR(){
  bool val=AND();
  while(p<=n && s[p]=='|'){
    p++;
    val |= AND();
  }
  return val;
}

int main(){
  FILE*fin=fopen("bool.in", "r");
  FILE*fout=fopen("bool.out", "w");
  int i, k;
  char c;
  c=fgetc(fin);
  n=0;
  while(c!='\n'){
    while(c==' ')
      c=fgetc(fin);
    if(c=='('|| c==')'){
      n++;
      s[n]=c;
      c=fgetc(fin);
    }
    i=0;
    while(isalpha(c)){
      aux[i++]=c;
      c=fgetc(fin);
    }
    aux[i] = 0;
    if(i==1)
      s[++n]=aux[0];

    else{
      if(strcmp(aux, "NOT")==0)
        s[++n]='!';
      if(strcmp(aux, "OR")==0)
        s[++n]='|';
      if(strcmp(aux, "AND")==0)
        s[++n]='&';
      if(strcmp(aux, "TRUE")==0)
        s[++n]='1';
      if(strcmp(aux, "FALSE")==0)
        s[++n]='0';
    }
  }
  for(i=1; i<=n; i++)
    printf("%c", s[i]);
  fscanf(fin, "%d", &k);
  c=fgetc(fin);
  while(!isalpha(c))
    c=fgetc(fin);

  for(i=1; i<=k; i++){
    lit[c-'A']^=1;
    p=0;
    fprintf(fout, "%d", OR());
    c=fgetc(fin);
  }
  return 0;
}