Pagini recente » Cod sursa (job #1224882) | Cod sursa (job #1724889) | Cod sursa (job #1225067) | Cod sursa (job #1269951) | Cod sursa (job #60648)
Cod sursa(job #60648)
#include <cstdio>
#include <cstring>
#define maxL 1002
#define maxN 102
#define alfa 27
FILE *in = fopen("bool.in","r"), *out = fopen("bool.out","w");
char e[maxL];
int alf[alfa] = {0};
char var[maxN];
int n;
char RPN[maxL];
int l;
void read()
{
fgets(e, maxL, in);
fscanf(in, "%d\n", &n);
for ( int i = 0; i < n; ++i )
fscanf(in, "%c", &var[i]);
l = strlen(e) - 1;
e[l] = '\0';
}
void norm()
{
char t[maxL];
int k = 0;
for ( int i = 0; i < l; ++i )
if ( e[i] == 'A' && e[i+1] == 'N' )
t[k++] = '&', i += 2;
else if ( e[i] == 'O' && e[i+1] == 'R' )
t[k++] = '|', i += 2;
else if ( e[i] == 'N' && e[i+1] == 'O' )
t[k++] = '~', i += 2;
else if ( e[i] == 'T' && e[i+1] == 'R' )
t[k++] = '1', i += 3;
else if ( e[i] == 'F' && e[i+1] == 'A' )
t[k++] = '0', i += 4;
else if ( e[i] != ' ' )
t[k++] = e[i];
t[k] = '\0';
strcpy(e, t);
l = strlen(e);
}
int isalpha(char c)
{
return (c <= 'Z' && c >= 'A') || c == '1' || c == '0';
}
void conv()
{
char st[maxL];
int r = -1;
int k = -1;
for ( int i = 0; i < l; i++ )
{
if ( isalpha(e[i]) )
{
++r;
RPN[r] = e[i];
}
else if ( e[i] == '|' )
{
while ( (st[k] == '&' || st[k] == '|' || st[k] == '~') && k >= 0 )
{
++r;
RPN[r] = st[k];
--k;
}
++k;
st[k] = e[i];
}
else if ( e[i] == '&' )
{
while ( (st[k] == '&' || st[k] == '~') && k >= 0 )
{
++r;
RPN[r] = st[k];
--k;
}
++k;
st[k] = e[i];
}
else if ( e[i] == '~' )
{
++k;
st[k] = e[i];
}
else if ( e[i] == '(' )
{
++k;
st[k] = '(';
}
else
{
while ( st[k] != '(' && k >= 0 )
{
++r;
RPN[r] = st[k];
--k;
}
--k;
}
}
while ( k >= 0 )
{
++r;
RPN[r] = st[k];
--k;
}
l = r+1;
RPN[l] = '\0';
}
int eval()
{
int st[maxL];
int k = -1;
for ( int i = 0; i < l; ++i )
{
if ( RPN[i] >= 'A' && RPN[i] <= 'Z' )
st[++k] = alf[RPN[i]-'A'];
else if ( RPN[i] == '0' )
st[++k] = 0;
else if ( RPN[i] == '1' )
st[++k] = 1;
else if ( RPN[i] == '|' )
{
if ( st[k] == 1 || st[k-1] == 1 )
st[k-1] = 1;
else
st[k-1] = 0;
--k;
}
else if ( RPN[i] == '&' )
{
if ( st[k] == 0 || st[k-1] == 0 )
st[k-1] = 0;
else
st[k-1] = 1;
--k;
}
else
{
if ( st[k] == 0 )
st[k] = 1;
else
st[k] = 0;
}
}
return st[k];
}
int main()
{
read();
norm();
conv();
for ( int i = 0; i < n; ++i )
{
if ( alf[var[i]-'A'] == 1 )
alf[var[i]-'A'] = 0;
else
alf[var[i]-'A'] = 1;
fprintf(out, "%c", eval()==1?'1':'0');
}
fprintf(out, "\n");
return 0;
}