Pagini recente » Cod sursa (job #782252) | Cod sursa (job #890402) | Cod sursa (job #3209802) | Cod sursa (job #2164734) | Cod sursa (job #2580867)
#include <fstream>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
int n, lg;
char c[1001], lit;
int p[1001];
int v[1001];
bool val[26];
void paranteze()
{
stack < int > stiva;
for (int i = 0; c[i]; i++)
if (c[i] == '(')
stiva.push(i);
else if (c[i] == ')')
{
p[stiva.top()] = i;
stiva.pop();
}
}
struct stv
{
int poz, nr_not;
char semn;
};
bool rezolva(int st, int dr)
{
char semn = 0;
int NR_NOT = 0;
int nrv = 0;
stack < stv > stiva;
stv aux;
for (int i = st; i <= dr; i++)
{
if (c[i] >= 'A' && c[i] <= 'Z')
{
if (c[i + 1] == ' ' || c[i + 1] == 0 || c[i + 1] == ')' || c[i] == 'T' || c[i] == 'F')
{
bool x;
if (c[i] == 'T' && c[i+1] == 'R')
{
x = true;
i += 3;
}
else if (c[i] == 'F' && c[i+1] == 'A')
{
x = false;
i += 4;
}
else
x = val[c[i] - 'A'];
if (NR_NOT)
{
x = !x;
if (NR_NOT % 2)
x = !x;
NR_NOT = 0;
}
if (semn == 0 || semn == '|')
{
nrv++;
v[nrv] = x;
}
else if (semn == '&')
v[nrv] = (v[nrv] && x);
}
else if (c[i] == 'A')
{
semn = '&';
i += 2;
}
else if (c[i] == 'O')
{
semn = '|';
i += 1;
}
else if (c[i] == 'N')
{
NR_NOT++;
i += 2;
}
}
else if (c[i] == '(')
{
aux.poz = nrv + 1;
aux.nr_not = NR_NOT, NR_NOT = 0;
aux.semn = semn, semn = 0;
stiva.push(aux);
}
else if (c[i] == ')')
{
for (int j = stiva.top().poz + 1; j <= nrv; j++)
v[stiva.top().poz] = (v[stiva.top().poz] || v[j]);
nrv = stiva.top().poz;
if (stiva.top().nr_not)
{
v[nrv] = !v[nrv];
stiva.top().nr_not--;
if (stiva.top().nr_not % 2)
v[nrv] = !v[nrv];
stiva.top().nr_not = 0;
}
if (stiva.top().semn == '&')
{
v[nrv - 1] = (v[nrv - 1] && v[nrv]);
nrv--;
}
stiva.pop();
}
}
for (int i = 2; i <= nrv; i++)
v[1] = (v[1] || v[i]);
return v[1];
}
int main()
{
f.getline(c, sizeof(c));
lg = strlen(c);
paranteze();
f >> n;
while (n--)
{
f >> lit;
val[lit - 'A'] = !val[lit - 'A'];
g << rezolva(0, lg - 1);
}
return 0;
}