Pagini recente » Cod sursa (job #2632984) | Cod sursa (job #812883) | Cod sursa (job #2793818) | Cod sursa (job #258071) | Cod sursa (job #2482875)
#include <fstream>
#include <deque>
#include <string>
using namespace std;
ifstream fin( "bool.in" );
ofstream fout( "bool.out" );
string s, s2;
int N;
bool val[30];
void Read()
{
getline( fin, s );
fin >> N;
fin >> s2;
}
int Operate( int A, int B, char OP )
{
if( OP == '!' ) return 1 - B;
if( OP == '&' ) return ( A == 1 && B == 1 );
if( OP == '|' ) return ( A == 1 || B == 1 );
}
int Priority( char OP )
{
if( OP == '!' ) return 3;
if( OP == '&' ) return 2;
if( OP == '|' ) return 1;
if( OP == '(' ) return 0;
}
void ExpEval()
{
deque <int> var;
deque <char> op;
for( int i = 0; i < s.size(); ++i )
{
if( s[i] == ' ' ) continue;
if( s[i] == '(' )
{
op.push_back( '(' );
continue;
}
if( i < s.size() - 3 && s[i] == 'T' && s[i + 1] == 'R' && s[i + 2] == 'U' )
{
var.push_back( 1 );
i += 3;
continue;
}
if( i < s.size() - 4 && s[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' )
{
var.push_back( 0 );
i += 4;
continue;
}
if( s[i] == ')' )
{
while( op.back() != '(' )
{
int temp_op = op.back();
op.pop_back();
int A, B;
B = var.back();
var.pop_back();
if( temp_op != '!' ) { A = var.back();
var.pop_back();
}
int ans = Operate( A, B, temp_op );
var.push_back( ans );
}
op.pop_back();
continue;
}
if( 'A' <= s[i] && s[i] <= 'Z' && ( i == s.size() - 1 || ( 'A' > s[i + 1] || 'Z' < s[i + 1] ) ) )
{
var.push_back( val[s[i] - 'A'] );
continue;
}
char ope;
if( i < s.size() - 2 && s[i] == 'N' && s[i + 1] == 'O' )
{
ope = '!';
i += 2;
}
if( i < s.size() - 2 && s[i] == 'A' && s[i + 1] == 'N' )
{
ope = '&';
i += 2;
}
if( i < s.size() - 1 && s[i] == 'O' && s[i + 1] == 'R' )
{
ope = '|';
i += 1;
}
while( !op.empty() && Priority( op.back() ) >= Priority( ope ) )
{
int temp_op = op.back();
op.pop_back();
int A, B;
B = var.back();
var.pop_back();
if( temp_op != '!' ) { A = var.back();
var.pop_back();
}
int ans = Operate( A, B, temp_op );
var.push_back( ans );
}
op.push_back( ope );
}
while( !op.empty() )
{
int temp_op = op.back();
op.pop_back();
int A, B;
B = var.back();
var.pop_back();
if( temp_op != '!' ) { A = var.back();
var.pop_back();
}
int ans = Operate( A, B, temp_op );
var.push_back( ans );
}
fout << var.front();
}
void Do()
{
for( int i = 1; i <= N; ++i )
{
char c = s2[i - 1];
val[c - 'A'] = 1 - val[c - 'A'];
ExpEval();
}
}
int main()
{
Read();
Do();
fin.close();
fout.close();
return 0;
}