Pagini recente » Cod sursa (job #1269689) | Cod sursa (job #2230930) | Cod sursa (job #1440574) | Cod sursa (job #1725039) | Cod sursa (job #60616)
Cod sursa(job #60616)
#include <cstdio>
#include <cstring>
#define maxL 1000
#define maxN 100
#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 state = 0; // 0 daca 1 == 1 si 0 == 0, 1 altcumva
int l;
void read()
{
fgets(e, maxL, in);
fscanf(in, "%d\n", &n);
fgets(var, maxN, in);
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] == '&' || 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] == '~' && k >= 0 )
{
++r;
RPN[r] = st[k];
--k;
}
++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;
}
// printf("%s", RPN);
}
int eval()
{
char st[maxL];
int k = -1;
for ( int i = 0; i < l; ++i )
{
if ( RPN[i] <= 'Z' && RPN[i] >= 'A' )
st[++k] = RPN[i];
else if ( RPN[i] == '0' || RPN[i] == 1 )
{
if ( state == 0 )
st[++k] = RPN[i];
else
{
if ( RPN[i] == '0' )
st[++k] = 1;
else
st[++k] = 0;
}
}
else if ( RPN[i] == '|' )
{
st[k-1] = alf[st[k]-'A'] | alf[st[k-1]-'A'];
--k;
}
else if ( RPN[i] == '&' )
{
st[k-1] = alf[st[k]-'A'] & alf[st[k-1]-'A'];
--k;
}
else
{
st[k] = (alf[st[k]-'A']==1)?0:1;
}
}
return st[0];
}
int main()
{
read();
norm();
// puts(e);
conv();
// printf("\n");
int q = strlen(var)-1;
// printf("%d\n", eval());
// printf("%s", var);
for ( int i = 0; i < q; ++i )
{
if ( alf[var[i]-'A'] == 1 )
{
state = state==0?1:0;
alf[var[i]-'A'] = 0;
}
else
{
state = state==0?1:0;
alf[var[i]-'A'] = 1;
}
fprintf(out, "%d", eval());
}
fprintf(out, "\n");
return 0;
}