Pagini recente » Cod sursa (job #3226460) | Cod sursa (job #2964221) | Cod sursa (job #1086837) | Cod sursa (job #1269815) | Cod sursa (job #84432)
Cod sursa(job #84432)
#include <cstdio>
#include <string.h>
#include <fstream>
using namespace std;
#define FIN "bool.in"
#define FOUT "bool.out"
#define MAX_N 1<<12
#define Lconst 65
int Value[MAX_N >> 3]; //valoarea binara a termeniilor
short int stackp[MAX_N]; //stiva de valori
char stack[MAX_N]; //stiva
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 [51] = 1; //valuare constantei TRUE
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;
}
}
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;
}