Cod sursa(job #2703601)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 8 februarie 2021 20:05:01
Problema Bool Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>

using namespace std;
#define NMAX 1000
int p;
bool val[256];
string x, s;
bool and1();
bool termen1();
bool or1();
bool or1() {
  bool rez = and1();
  while ( x[p] == '|' ) {
    p++;
    rez |= and1();
  }
  return rez;
}
bool and1() {
  bool rez = termen1();
  while ( x[p] == '&' ) {
    p++;
    rez &= termen1();
  }
  return rez;
}
bool termen1() {
  bool rez, rez1;
  rez = 0;
  while ( x[p] == '!' ) {
    p++;
    rez = !rez;
  }
  /// daca e paranteza sau litera
  if ( x[p] == '(' ){
    p++;
    rez1 = or1();
  }
  else
    rez1 = val[x[p]];
  p++;
  if ( rez )
    rez1 = !rez;
  return rez1;
}
ifstream cin ( "bool.in" );
ofstream cout ( "bool.out" );
int main() {
    int n, i;
    char ch;
    getline( cin, s );
    for ( i = 0; i < s.size(); i++ ) {
        if ( s.substr(i, 2) == "OR" )
            x += '|', ++i;
        else if ( s.substr(i, 3) == "NOT" )
            x += '!', i += 2;
        else if ( s.substr(i, 3) == "AND" )
            x += '&', i += 2;
        else if ( s.substr(i, 4) == "TRUE" )
            x += '1', i += 3;
        else if ( s.substr(i, 5) == "FALSE" )
            x += '0', i += 4;
        else if ( s[i] != ' ' )
            x += s[i];
    }
    val['1'] = 1;
    cin >> n;
    for ( i = 1; i <= n; i++ ) {
      cin >> ch;
      val[ch] = !val[ch];
      p = 0;
      cout << or1();
    }
    return 0;
}