Pagini recente » Cod sursa (job #302885) | Cod sursa (job #224879) | Cod sursa (job #2059883) | Cod sursa (job #1368564) | Cod sursa (job #870841)
Cod sursa(job #870841)
#include <fstream>
using namespace std;
ifstream f ( "bool.in" );
ofstream g ( "bool.out" );
#include <string>
#define LE 6666
string S;
string str;
int i, t, A[LE], K;
int n;
bool lev1(), lev2(), lev3();
char CH;
bool fr[LE];
int main()
{
getline ( f, S );
int N = S.length();
for ( i = 0; i < N; ++i )
{
if ( S[i] == ' ' ) continue;
if ( i + 1 < N && S[i] >= 'A' && S[i] <= 'Z' && S[i+1] >= 'A' && S[i+1] <= 'Z' )
{
str = "";
for ( ; i < N && S[i] >= 'A' && S[i] <= 'Z'; ++i ) str += S[i];
if ( str == "OR" ) A[++K] = '|';
if ( str == "AND" ) A[++K] = '&';
if ( str == "NOT" ) A[++K] = '!';
if ( str == "TRUE" ) A[++K] = 'a';
if ( str == "FALSE" ) A[++K] = 'b';
--i;
continue;
}
if ( S[i] == '(' || S[i] == ')' ) A[++K] = S[i];
if ( S[i] >= 'A' && S[i] <= 'Z' )
A[++K] = S[i];
}
f >> n;
f.get();
fr['a'] = true, fr['b'] = false;
for ( t = 1; t <= n; ++t )
{
f >> CH;
fr[CH] = !fr[CH];
i = 1;
g << lev1();
}
f.close();
g.close();
return 0;
}
bool lev1()
{
if ( A[i] == '(' ) ++i;
bool result = lev2();
while ( i <= K && A[i] == '|' )
{
++i;
result |= lev2();
}
++i;
return result;
}
bool lev2()
{
bool result = lev3();
while ( i <= K && A[i] == '&' )
{
++i;
result &= lev3();
}
return result;
}
bool lev3()
{
bool semn = false, result = false;
if ( A[i] == '!' ) semn = 1, ++i;
if ( A[i] == '(' )
result = lev1() ^ semn;
else if ( ( A[i] >= 'A' && A[i] <= 'Z' ) || A[i] == 'a' || A[i] == 'b' )
result = fr[A[i++]] ^ semn;
return result;
}