Cod sursa(job #130433)

Utilizator TociToxAnonim Anonim TociTox Data 1 februarie 2008 10:37:57
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.96 kb
#include <cstdio>   
#include <string>   
  
using namespace std;   
  
int x[128], st[10512], sol, poz;   
char buf[1024];   
  
#define OR -3   
#define NOT -1   
#define AND -2   
#define Open -4   
#define Close -5   
  
#define FALSE 31   
#define TRUE 30   
  
int expresie();   
  
int factor()   
{   
    int aux;   
    if(st[poz] > 0)    
    {   
       aux = x[st[poz]];   
       ++poz;   
    } else  
    if(st[poz] == NOT)   
    {   
       ++poz;           
       aux = !(expresie());   
    } 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,1024,stdin);      
//    printf("%s", buf);   
  
    int dim = strlen(buf) - 1;     
       
    for (int i=0;i < dim;++i)   
    {   
        switch (buf[i])   
        {   
               //SPATIU   
               case ' ': break;   
               //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 : 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();            
         printf("%d", ret);                 
    }     
  
    printf("\n");   
       
    return 0;       
}