Cod sursa(job #134409)

Utilizator crawlerPuni Andrei Paul crawler Data 11 februarie 2008 17:44:02
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.52 kb
#include <cstdio>
#include <string>

using namespace std;

int x[128], st[10512], sol, poz;
char buf[11024];

#define OR -3
#define NOT -1
#define AND -2
#define Open -4
#define Close -5

#define FALSE 31
#define TRUE 30

//1..29 Literele
//30 TRUE 31 FALSE
//  -1 == NOT  -2 == AND  -3 == OR  -5 == (  -4 == )
int expresie ();

int factor()
{
  int aux;
  if (st[poz] > 0)
    aux = x[st[poz]],poz++;
  else if (st[poz] == (NOT))
    poz++,aux = !(factor ());
  else if (st[poz] == (Open))
    poz++,aux = expresie(),poz++;
  return (aux);
}

int termen()
{
  int aux = factor ();
  while (st[poz] == (AND))
    {
      poz++;
      aux &= factor ();
    }
  return (aux);
}

int expresie()
{
  int aux = termen ();
  while (st[poz] == (OR))
    {
      poz++;
      aux |= termen ();
    }
  return (aux);
}
int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    
    fgets(buf,11024,stdin);   
//    printf("%s", buf);

    int dim = strlen(buf) - 1;  
    
    for (int i=0;i < dim;++i)
    {
        switch (buf[i])
        {
               //NOT
               case 'N':
               if (buf[i+1] == 'O')
               {
                  st[++poz] = NOT;                               
                  i+=2;
               } else st[++poz] = buf[i]-'A'+1;                                              
               break;               
               //TRUE
               case 'T':
               if (buf[i+1] == 'R')
               {
                  st[++poz] = TRUE;                               
                  i+=3;
               } else st[++poz] = buf[i]-'A'+1;                                              
               break;               
               //FALSE
               case 'F':
               if (buf[i+1] == 'A')
               {
                  st[++poz] = FALSE;                               
                  i+=4;
               } else st[++poz] = buf[i]-'A'+1;                                              
               break;               
               //OR
               case 'O':
               if (buf[i+1] == 'R')
               {
                  st[++poz] = OR;                               
                  ++i;
               } else st[++poz] = buf[i]-'A'+1;                                              
               break;               
               //AND
               case 'A':
               if (buf[i+1] == 'N')
               {
                  st[++poz] = AND;                               
                  i+=2;
               } else st[++poz] = buf[i]-'A'+1;                                              
               break;                              
               // (
               case '(': st[++poz] = Open; break;
               // )     
               case ')': st[++poz] = Close; break;        
               //LITERA               
               default : if(buf[i]^' ') st[++poz] = buf[i]-'A'+1;                                            
        }    
    }    

    st[++poz] = -88;    
    for(int i=0;i<32;++i)
    x[i] = 0;
    x[TRUE] = 1;    

    int t, ret; char c;
    
    scanf("%d\n", &t);
    
    while(t--)
    {
         scanf("%c", &c);         
         x[c-'A'+1] ^= 1;
         poz = 1;
         ret = expresie();     
         if (ret) ret = 1;    
         printf("%d", ret);              
    }  

    printf("\n");
    
    return 0;    
}