Cod sursa(job #130261)

Utilizator crawlerPuni Andrei Paul crawler Data 31 ianuarie 2008 18:27:41
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.45 kb
#include <cstdio>

using namespace std;

int x[32], st[512], 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);
    
    for (int i=0;buf[i]!='\n';++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';                                              
               break;               
               //TRUE
               case 'T':
               if (buf[i+1] == 'R')
               {
                  st[++poz] = TRUE;                               
                  i+=3;
               } else st[++poz] = buf[i]-'A';                                              
               break;               
               //FALSE
               case 'F':
               if (buf[i+1] == 'A')
               {
                  st[++poz] = FALSE;                               
                  i+=4;
               } else st[++poz] = buf[i]-'A';                                              
               break;               
               //OR
               case 'O':
               if (buf[i+1] == 'R')
               {
                  st[++poz] = OR;                               
                  ++i;
               } else st[++poz] = buf[i]-'A';                                              
               break;               
               //AND
               case 'A':
               if (buf[i+1] == 'N')
               {
                  st[++poz] = AND;                               
                  i+=2;
               } else st[++poz] = buf[i]-'A';                                              
               break;                              
               // (
               case '(': st[++poz] = Open; break;
               // )     
               case ')': st[++poz] = Close; break;        
               //LITERA
               default : st[++poz] = buf[i]-'A';                                            
        }    
    }    

    x[TRUE] = 1;    

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

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