Pagini recente » Cod sursa (job #3216051) | Cod sursa (job #3148753) | Cod sursa (job #2975673) | Cod sursa (job #1272682) | Cod sursa (job #84326)
Cod sursa(job #84326)
#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;
}