Cod sursa(job #2790444)

Utilizator YusyBossFares Yusuf YusyBoss Data 28 octombrie 2021 23:41:03
Problema Bool Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 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 = -1;

  if (s[poz] == '!')
    vnot = 1, poz++;

  if (s[poz] == '(') {
    poz++;
    val = f_OR();
    poz++;
  }

  if (val == -1 && (s[poz] == '0' || s[poz] == '1'))
    val = s[poz] - '0', poz++;
  else if (val == -1)
    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]] = 1  - mpval[q[i]];
    poz = 0;
    cout << f_OR();
  }
  return 0;
}