Cod sursa(job #84326)

Utilizator floringh06Florin Ghesu floringh06 Data 14 septembrie 2007 14:56:47
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.51 kb
#include <cstdio>
#include <string.h>
#include <fstream>

using namespace std;

#define FIN "bool.in"
#define FOUT "bool.out"
#define MAX_N 1<<10
#define Lconst 65

int Value[100]; //valoarea binara a termeniilor

char stack[MAX_N]; //stiva 
int  stackp[MAX_N]; //f poloneza
char exp[MAX_N];   //expresia initiala
char psf[MAX_N]; //expresia in forma poloneza

int N, i, top, ptop;

char MOD[MAX_N>>3]; //modificarile
int Nmod, Nfix;

    void stin (char c)
    {
         stack [top++] = c;
    }
    
    char stout ()
    {
         return stack[--top];
    }
    
    void pstin (int c)
    {
         stackp [ptop++] = c;
    }
    
    int pstout ()
    {
         return stackp[--ptop];
    }

    void read_data ( void )
    {
         char ax[MAX_N] = "";
         int i, p = -1;
         
         fgets (ax, MAX_N, stdin);
         scanf("%d\n", &Nmod);     
         fgets (MOD, Nmod + 10, stdin);
         
         N = strlen (ax) - 1;
         for ( i = 0; i <= N; ++i)
         {
             if (ax[i] == 'A' && ax[i+1] == 'N' && ax[i+2] == 'D')
             {
                       i += 2; exp[++p] = '&'; continue;
             }
             if (ax[i] == 'O' && ax[i+1] == 'R')
             {
                       i += 1; exp[++p] = '|'; continue;
             }
             if (ax[i] == 'N' && ax[i+1] == 'O' && ax[i+2] == 'T')
             {
                       i += 2; exp[++p] = '^'; continue;
             }
             if (ax[i] == 'T' && ax[i+1] == 'R' && ax[i+2] == 'U')
             {
                       i += 3; exp[++p] = 't'; continue;
             }
             if (ax[i] == 'F' && ax[i+1] == 'A' && ax[i+2] == 'L')
             {
                       i += 4; exp[++p] = 'f'; continue;
             }
             if (ax[i] != 32 ) exp[++p] = ax[i];
         }
         N = p;
    }
    
    void modify (char c)
    {
         Value[c - Lconst] = 1 - Value[c - Lconst];
    }
    
    void solve ( void )
    {
         int i, p = -1;
         top = 0;
         
         memset (Value, 0, sizeof (Value));
         
         Value ['t' - Lconst] = 1;
         
         for ( i = 0; i <= N; ++i)
         {
             if (exp[i] >= 65 && exp[i] <=90 || (exp[i] == 't' || exp[i] == 'f'))
             {
                psf [++p] = exp [i];
                while (stack[top-1] == '^') psf[++p] = stout ();
             }
                
             if (exp[i] == '(') stin ('(');
             
             if (exp[i] == ')') 
                while (top) 
                {
                      char c = stout();
                      if ( c != '(' ) psf[++p] = c; else break;
                }
             
             if (exp[i] == '&' || exp[i] == '|')
             {
                while (top)
                {
                      if (stack [top - 1] == '(') break;
                      psf [++p] = stout();
                }
                stin (exp[i]);
             }
             
             if (exp[i] == '^')
             {
                stin (exp[i]);
             }
         }     
         while (top) psf[++p] = stout(); // golesc stiva
         
         Nfix = p;
      /*   
         for ( i = 0; i <= Nfix; ++i)
             printf ("%c", psf[i]);
      */
    }     
    //rezolv forma poloneza 
    void answer ( void )
    {
         ptop = 0;
         memset (stackp, 0 , sizeof (stackp));
         int i;
         
         for ( i = 0; i <= Nfix; ++i)
         {
             if (psf[i]>=65 && psf[i]<=90 || (psf[i] == 't' || psf[i] == 'f'))
                pstin (Value[psf[i] - Lconst]);
                
             if (psf[i] == '^')
                stackp[ptop - 1] = 1 - stackp[ptop - 1];
                
             if (psf[i] == '&')
             {
                stackp[ptop - 2] = stackp[ptop - 1] & stackp[ptop - 2];      
                --ptop;
             }
             
             if (psf[i] == '|')
             {
                stackp[ptop - 2] = stackp[ptop - 1] | stackp[ptop - 2];      
                --ptop;
             }
         }
         if (ptop != 1) while (1) {};
         printf ("%d", stackp [0]);
    }
         

    int main ()
    {
        freopen (FIN, "r", stdin);
        freopen (FOUT, "w", stdout);
        
        read_data ();
        solve ();
        
        for ( i = 0; i < Nmod; ++i)
        {
            modify(MOD[i]);
            answer ();
        }
        
        return 0;
    }