Cod sursa(job #271169)

Utilizator FlorianFlorian Marcu Florian Data 4 martie 2009 22:37:09
Problema Bool Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define Nmax 1024
char s[Nmax],o[Nmax];
int n;
int p;
int val[27];
void poloneza()
 {
  int i,j;
  int n=strlen(s);
  char st[Nmax];
  int vf=0; p=-1;
  for(i=0;i<n;++i)
   {
    if(s[i]=='(') st[++vf] = '(';
    else if(s[i]==')')
      {
       while(vf && st[vf]!='(')
        o[++p] = st[vf--];
       vf--;
       if(st[vf]=='!') o[++p] = st[vf--];
      }
    else if(s[i]=='O' && i+1<n && s[i+1] == 'R') //OR
     {
       while(st[vf] == '|' || st[vf] =='&')  o[++p] = st[vf--];
       st[++vf] = '|';
       i=i+1;
     }
    else if(s[i]=='A' && i+2<n && s[i+1]=='N' && s[i+2]=='D')
     {
      while(st[vf] == '&') o[++p] = st[vf--];
      st[++vf] = '&';
      i=i+2;
     }
    else if(s[i] == 'N' && i+2<n && s[i+1]=='O' && s[i+2]=='T')
     {
      i=i+2;
      st[++vf] = '!';
     }
    else if(s[i]=='T' && i+3<n && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E')
     {
      o[++p] = 't';
      i=i+3;
     }
    else if(s[i]=='F' && i+4<n && s[i+1]=='A' && s[i+2]=='L' && s[i+3]=='S' && s[i+4]=='E')
     {
      o[++p] = 'f';
      i=i+4;
     }
    else if(isalpha(s[i])) o[++p] = s[i];
  }
 while(vf) o[++p] = st[vf--];
 }
int eval()
 {
  int st[Nmax];
  int vf=0,i;
  for(i=0;i<=p;++i)
   {
    if(isalpha(o[i]))
     {
      if(o[i] == 't') st[++vf]=1;
      else if(o[i]=='f') st[++vf] = 0;
      else st[++vf] = val[o[i] - 65];
     }
    else if(o[i]=='!')  st[vf] = !st[vf];
    else if(o[i]=='|') { st[vf-1] = st[vf-1]|st[vf]; --vf; }
    else if(o[i]=='&') { st[vf-1] = st[vf-1]&st[vf]; --vf; }
   }
 return st[1];
 }
int main()
 {
  FILE*f=fopen("bool.in","r");
  FILE*g=fopen("bool.out","w");
  int i=0,sol;
  char x;
  fgets(s,Nmax,f);
  poloneza();
  fscanf(f,"%d\n",&n);
  for(i=1;i<=n;++i)
   {
    fscanf(f,"%c",&x);
    val[x-65] = 1-val[x-65];
    sol=eval();
    fprintf(g,"%d",sol);
   }
  return 0;
 }