Cod sursa(job #2790431)

Utilizator YusyBossFares Yusuf YusyBoss Data 28 octombrie 2021 23:04:36
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <map>

using namespace std;

ifstream cin ("bool.in");
ofstream cout ("bool.out");

string s;
map <char, bool> mpval;
int n, poz;

bool f_AND();
bool f_OR();

void skip_space() {
  while (s[poz] == ' ')
    poz++;
}

bool get_val() {
  int vnot = 0;

  skip_space();
  if (poz + 1 < n && s[poz] == 'N' && s[poz + 1] == 'O') {
    poz += 3;
    vnot = 1;
  }

  skip_space();
  if (poz < n && s[poz] == '(') {
    poz++;

    if (vnot == 1)
      return 1 - f_OR();
    else
      return f_OR();
    poz++;
  }

  skip_space();

  if (poz + 1 < n && s[poz] == 'T' && s[poz + 1] == 'R') {
    poz += 4;
    if (vnot == 1)
      return 0;
    return 1;
  }
  if (poz + 1 < n && s[poz] == 'F' && s[poz + 1] == 'A') {
    poz += 5;
    if (vnot == 1)
      return 1;
    return 0;
  }

  poz++;
  if (vnot == 1)
    return 1 - mpval[s[poz - 1]];
  return mpval[s[poz - 1]];
}

bool f_AND() {
  int val, aux;

  val = get_val();
  skip_space();
  while (poz < n && s[poz] == 'A') {
    poz += 3;
    skip_space();

    aux = get_val();
    val = (val & aux);

    skip_space();
  }

  return val;
}

bool f_OR() {
  int val;

  val = f_AND();
  skip_space();
  while (poz < n && s[poz] == 'O') {
    poz += 2;
    skip_space();

    val = (val | f_AND());

    skip_space();
  }

  return val;
}

int main() {
  int m, i;
  string q;

  getline(cin, s);
  cin >> m >> q;
  n = s.size();

  for (i = 0; i < m; i++) {
    mpval[q[i]] = 1  - mpval[q[i]];
    poz = 0;
    cout << f_OR();
  }
  return 0;
}