Cod sursa(job #2790459)

Utilizator YusyBossFares Yusuf YusyBoss Data 29 octombrie 2021 00:25:06
Problema Bool Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 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();

bool get_val() {
  int vnot = 0, val = 0;

  while (s[poz] == '!') {
    vnot = !vnot;
    poz++;
  }

  if (s[poz] == '(') {
    poz++;
    val = f_OR();
    poz++;
  }
  else if ((s[poz] == '0' || s[poz] == '1')) {
    val = s[poz] - '0';
    poz++;
  }
  else {
    val = mpval[s[poz]];
    poz++;
  }

  if (vnot == 1)
    return !val;
  return val;
}

bool f_AND() {
  int val;

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

  return val;
}

bool f_OR() {
  int val;

  val = f_AND();
  while (poz < n && s[poz] == '|') {
    poz++;
    val = (val | f_AND());
  }

  return val;
}

void fsimpl(string& s1) {
  int i;

  s = "";
  for (i = 0; i < n; i++) {
    if ((i + 2) < n && s1[i] == 'A' && s1[i + 1] == 'N' && s1[i + 2] == 'D') {
      s += '&';
      i += 2;
    }
    else if ((i + 1) < n && s1[i] == 'O' && s1[i + 1] == 'R') {
      s += '|';
      i++;
    }
    else if ((i + 2) < n && s1[i] == 'N' && s1[i + 1] == 'O' && s1[i + 2] == 'T') {
      s += '!';
      i += 2;
    }
    else if ((i + 3) < n && s1[i] == 'T' && s1[i + 1] == 'R' && s1[i + 2] == 'U' && s1[i + 3] == 'E') {
      s += '1';
      i += 3;
    }
    else if ((i + 4) < n && s1[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' && s[i + 3] == 'S' && s[i + 4] == 'E') {
      s += '0';
      i += 4;
    }
    else if (s1[i] != ' ')
      s += s1[i];
  }

  n = s.size();
}

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

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

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