Pagini recente » Cod sursa (job #393629) | Cod sursa (job #2219520) | Cod sursa (job #1739952) | Cod sursa (job #1853001) | Cod sursa (job #844813)
Cod sursa(job #844813)
#include<stdio.h>
#include<string.h>
using namespace std;
#define MAXL 2005
int N;
int st[ MAXL ], op[ MAXL ], NOT[ MAXL ], v[100];
char S[ MAXL ], A[205];
int main()
{
FILE *f, *g;
f = fopen("bool.in", "r");
g = fopen("bool.out", "w");
fgets(S, 2003, f);
int len = strlen(S) - 1;
if(S[len] == '\n')
--len;
fscanf(f, "%d", &N);
fgets(A, 3, f);
fgets(A, 203, f);
for(int q = 0; q < N; ++q)
{
v[ A[q] - 'A' ] = !v[ A[q] - 'A' ];
int top = 0;
for(int i = 0; i <= len; ++i)
{
if(S[i] == '(')
++top, st[top] = -1;
else if(S[i] == 'A' && S[i+1] == 'N')
op[top+1] = 2, i += 2;
else if(S[i] == 'N' && S[i+1] == 'O')
NOT[top+1] = !NOT[top+1], i += 2;
else if(S[i] == 'O' && S[i+1] == 'R')
op[top+1] = 3, ++i;
else if(S[i] == 'T' && S[i+1] == 'R')
++top, st[top] = 1, i += 3;
else if(S[i] == 'F' && S[i+1] == 'A')
++top, st[top] = 0, i += 4;
else if(S[i] >= 'A' && S[i] <= 'Z')
{
++top, st[top] = v[ S[i] - 'A' ];
if(NOT[top])
st[top] = !st[top], NOT[top] = 0;
}
else if(S[i] == ')')
{
int ii = top;
while(st[ii] != -1)
--ii;
int top2 = ii + 1;
for(int j = ii + 2; j <= top; ++j)
if(op[j] == 2)
{
if(st[top2] && st[j])
st[top2] = 1;
else st[top2] = 0;
}
else ++top2, st[top2] = st[j], op[top2] = op[j];
top = top2;
for(int j = ii + 2; j <= top; ++j)
{
if(st[ii+1] || st[j])
st[ii+1] = 1;
else st[ii+1] = 0;
}
st[ii] = st[ii+1];
top = ii;
if(NOT[top])
st[top] = !st[top], NOT[top] = 0;
}
}
int top2 = 1;
for(int i = 2; i <= top; ++i)
if(op[i] == 2)
{
if(st[top2] && st[i])
st[top2] = 1;
else st[top2] = 0;
}
else ++top2, st[top2] = st[i], op[top2] = op[i];
top = top2;
for(int i = 1; i <= top; ++i)
{
if(st[1] || st[i])
st[1] = 1;
else st[1] = 0;
}
if(NOT[1])
st[1] = !st[1];
fprintf(g, "%d", st[1]);
memset(NOT, 0, sizeof(NOT));
memset(st, 0, sizeof(st));
}
fprintf(g, "\n");
fclose(f);
fclose(g);
return 0;
}