Cod sursa(job #2790580)

Utilizator TghicaGhica Tudor Tghica Data 29 octombrie 2021 11:31:58
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#include <string>

using namespace std;

bool elem[100];
int poz, lung;
char s[1002];

bool evalSol();

bool getElem() {
  bool n = 0, val;

  if( s[poz] == 'N' ) {
    n = 1;
    poz += 3;
  }

  if( s[poz] == '(' ) {
    val = ( evalSol() ^ n );
    poz++;
  } else if( s[poz] == 'T' && s[poz + 1] == 'R' ) {
    val = ( 1 ^ n );
    poz += 4;
  } else if( s[poz] == 'F' && s[poz + 1] == 'A' ) {
    val = ( 0 ^ n );
    poz += 5;
  } else {
    val = ( elem[s[poz]] ^ n );
    poz++;
  }

  return val;
}

bool evalSol() {
  poz++;
  int val, op;

  val = getElem();
  while( ( s[poz] == 'A' && s[poz + 1] == 'N' && s[poz + 2] == 'D' ) or ( s[poz] == 'O' && s[poz + 1] == 'R' ) ) {
    if( s[poz] == 'A' && s[poz + 1] == 'N' && s[poz + 2] == 'D' ) {
      poz += 3;
      val = ( val & getElem() );
    } else {
      poz += 2;
      val = ( val | getElem() );
    }
  }

  return val;
}

int main() {
  FILE *fin, *fout;
  fin = fopen( "bool.in", "r" );
  fout = fopen( "bool.out", "w" );
  int t;
  char ch;

  ch = fgetc( fin );
  while( ch != '\n' ) {
    if( ch != ' ' ) {
      lung++;
      s[lung] = ch;
    }
    ch = fgetc( fin );
  }

  fscanf( fin, "%d", &t );
  fgetc( fin );
  while( t-- ) {
    ch = fgetc( fin );
    elem[ch] = ( elem[ch] ^ 1 );
    poz = 0;
    fprintf( fout, "%d", evalSol() );
  }
  return 0;
}