Pagini recente » Diferente pentru numerele-sprague-grundy intre reviziile 38 si 2 | Cod sursa (job #532425)
Cod sursa(job #532425)
#include <fstream>
using namespace std;
const int NMAX = 102, LEMAX = 1002;
ifstream fi ("bool.in");
ofstream fo ("bool.out");
int N;
char S[LEMAX], T[NMAX], *P, *Q, L[26];
void citire (), afisare ();
int eval (), op_or (), op_and (), op_not ();
int eval ()
{
int n = op_or ();
while (*P == '|')
{
P++;
n |= op_or ();
}
return n;
}
int op_or ()
{
int n = op_and ();
while (*P == '&')
{
P++;
n &= op_and ();
}
return n;
}
int op_and ()
{
int n = op_not ();
while (*P == '^')
{
P++;
n ^= op_not ();
}
return n;
}
int op_not ()
{
int n;
if (*P == '(')
{
P++;
n = eval ();
P++;
}
else
{
if (*P >= 'A' && *P <= 'Z')
n = L[*P - 'A'];
else
n = *P;
P++;
}
return n;
}
void citire ()
{
fi.getline (S, LEMAX);
fi >> N;
fi >> T;
for (P = Q = S; *P; P++)
{
if (*P == 'N' && *(P+1) == 'O' && *(P+2) == 'T')
*Q++ = 1, *Q++ = '^', P += 2;
else if (*P == 'A' && *(P+1) == 'N' && *(P+2) == 'D')
*Q++ = '&', P += 2;
else if (*P == 'O' && *(P+1) == 'R')
*Q++ = '|', P += 1;
else if (*P == 'T' && *(P+1) == 'R' && *(P+2) == 'U' && *(P+3) == 'E')
*Q++ = 1, P += 3;
else if (*P == 'F' && *(P+1) == 'A' && *(P+2) == 'L' && *(P+3) == 'S' && *(P+4) == 'E')
*Q++ = 0, P += 4;
else if (*P >= 'A' && *P <= 'Z' || *P == '(' || *P == ')')
*Q++ = *P;
}
*Q = 0;
}
void afisare ()
{
for (int i = 0; i < N; ++i)
{
P = S;
L[T[i] - 'A'] ^= 1;
fo << eval ();
}
}
int main ()
{
citire ();
afisare ();
return 0;
}