Pagini recente » Cod sursa (job #1719035) | Cod sursa (job #1104994) | Cod sursa (job #1089130) | Cod sursa (job #2225230) | Cod sursa (job #1693006)
#include <bits/stdc++.h>
const int DIM = 1 << 11;
const int SIGMA = 27;
using namespace std;
char S[DIM], Aux[DIM], A[DIM]; bool V[SIGMA]; int N, T, pos, M;
bool solve_expression( int &i );
bool solve_small_priority( int &i );
bool solve_medium_priority( int &i );
bool solve_high_priority( int &i );
bool solve_value( int &i );
bool solve_expression( int &pos ) {
bool answer = solve_small_priority( pos );
while( S[pos] == '|' ) {
pos ++;
answer = ( answer | solve_small_priority( pos ) );
}
return answer;
}
bool solve_small_priority( int &pos ) {
bool answer = solve_medium_priority( pos );
while( S[pos] == '&' ) {
pos ++;
answer = ( answer & solve_medium_priority( pos ) );
}
return answer;
}
bool solve_medium_priority( int &pos ) {
bool answer;
if( S[pos] == '!' ) {
pos ++;
answer = ( !solve_high_priority( pos ) );
} else
answer = solve_high_priority( pos );
return answer;
}
bool solve_high_priority( int &pos ) {
bool answer;
if( S[pos] == '(' ) {
pos ++;
answer = solve_expression( pos );
pos ++;
} else
answer = solve_value( pos );
return answer;
}
bool solve_value( int &pos ) {
bool answer;
if( S[pos] == '1' ) {
pos ++;
answer = true;
} else
if( S[pos] == '0' ) {
pos ++;
answer = false;
} else {
answer = V[ S[pos] - 'A' ];
pos ++;
}
return answer;
}
int main() {
FILE *input_file = fopen( "bool.in" , "r" );
FILE *output_file = fopen( "bool.out", "w" );
fgets( Aux + 1, DIM, input_file );
M = strlen( Aux + 1 );
for( int i = 1; i < M; i ++ ) {
if( Aux[i] == 'F' && Aux[i + 1] == 'A' && Aux[i + 2] == 'L' && Aux[i + 3] == 'S' && Aux[i + 4] == 'E' ) {
S[++N] = '0';
continue;
}
if( Aux[i] == 'T' && Aux[i + 1] == 'R' && Aux[i + 2] == 'U' && Aux[i + 3] == 'E' ) {
S[++N] = '1';
continue;
}
if( Aux[i] == 'A' && Aux[i + 1] == 'N' && Aux[i + 2] == 'D' ) {
S[++N] = '&';
continue;
}
if( Aux[i] == 'N' && Aux[i + 1] == 'O' && Aux[i + 2] == 'T' ) {
S[++N] = '!';
continue;
}
if( Aux[i] == 'O' && Aux[i + 1] == 'R' ) {
S[++N] = '|';
continue;
}
if( Aux[i] == '(' || Aux[i] == ')' ) {
S[++N] = Aux[i];
continue;
}
if( Aux[i] >= 'A' && Aux[i] <= 'Z' && ( Aux[i - 1] < 'A' || Aux[i - 1] > 'Z' ) ) {
S[++N] = Aux[i];
continue;
}
}
fscanf( input_file, "%d %s", &T, A + 1 );
for( int t = 1; t <= T; t ++ ) {
V[ A[t] - 'A' ] = !V[ A[t] - 'A' ]; pos = 1;
if( solve_expression( pos ) )
fprintf( output_file, "1" );
else
fprintf( output_file, "0" );
}
return 0;
}