Pagini recente » Cod sursa (job #3140946) | Cod sursa (job #22808) | Cod sursa (job #10508) | Cod sursa (job #5392) | Cod sursa (job #27366)
Cod sursa(job #27366)
#include <cstdio>
#include <string.h>
#define Lmax 1024
#define Nmax 128
int n, v[255], pos, l;
char sir[Lmax], s[Nmax];
int evalor();
int evaland();
int evalnor();
int evalnot();
void citire()
{
gets(sir);
l = strlen(sir);
scanf("%d\n", &n);
scanf("%s\n", s);
}
int evalterm()
{
int ret;
if (sir[pos] == ' ')
++pos;
if (sir[pos] == '(')
{
++pos;
ret = evalor();
++pos;
}
else if (strncmp(sir + pos, "TRUE", 4) == 0)
{
ret = 1;
pos += 4;
}
else if (strncmp(sir + pos, "FALSE", 5) == 0)
{
ret = 0;
pos += 5;
}
else if ('A' <= sir[pos] && sir[pos] <= 'Z')
{
ret = v[sir[pos]];
pos += 1;
}
if (sir[pos] == ' ')
++pos;
return ret;
}
int evalnot()
{
int ret, nt = 0, val;
if (sir[pos] == ' ')
++pos;
if (strncmp(sir + pos, "NOT", 3) == 0)
{
nt = 1;
pos += 3;
ret = evalnot() ^ nt;
}
else
{
ret = evalterm() ^ nt;
}
if (sir[pos] == ' ')
++pos;
return ret;
}
int evaland()
{
int ret;
if (sir[pos] == ' ')
++pos;
ret = evalnot();
while (strncmp(sir + pos, "AND", 3) == 0)
{
pos += 3;
if (evalnot() != 1)
ret = 0;
}
if (sir[pos] == ' ')
++pos;
return ret;
}
int evalor()
{
int ret;
if (sir[pos] == ' ')
++pos;
ret = evaland();
while (strncmp(sir + pos, "OR", 2) == 0)
{
pos += 2;
ret |= evaland();
}
if (sir[pos] == ' ')
++pos;
return ret;
}
void solve()
{
int i;
for (i = 0; i < n; ++i)
{
pos = 0;
v[s[i]] = !v[s[i]];
printf("%d", evalor());
}
}
int main()
{
freopen("bool.in", "r", stdin);
freopen("bool.out", "w", stdout);
citire();
solve();
return 0;
}