Cod sursa(job #2325087)

Utilizator lucametehauDart Monkey lucametehau Data 21 ianuarie 2019 22:25:20
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <fstream>
#include <cstring>

using namespace std;

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

int i, x, q;
char ch;

char a[1005], p[1005];
string s;
string priority[3] = {"&|", "^", ""};

int op(int a, int b, char c) {
  if(c == '&')
    return a & b;
  if(c == '^')
    return a ^ b;
  return a | b;
}

bool f1(string a, char c) {
  for(int j = 0; j < a.size(); j++) {
    if(a[j] == c)
      return 1;
  }
  return 0;
}

int eval(int p) {
  int nr = 0, nr2 = 0;
  if(p == 2) {
    if(s[i] == '(')
      i++, nr = eval(0), i++;
    else
      nr = s[i] - '0', i++;
  } else {
    for(nr = eval(p + 1); f1(priority[p], s[i]) && i < s.size(); nr = nr2)
      nr2 = op(nr, eval(p + 1), s[i++]);
  }
  return nr;
}

bool check(int c, int b, string s) {
  if(b > x)
    return 0;
  for(int i = c; i <= b; i++) {
    if(s[i - c] != a[i])
      return 0;
  }
  return 1;
}

int main() {
  cin.getline(a + 1, 1005, '\n');
  x = strlen(a + 1);
  for(int i = 1; i <= x; i++) {
    if(a[i] == ' ')
      continue;
    if(check(i, i + 2, "NOT"))
      s.push_back('1'), s.push_back('^'), i += 2;
    else if(check(i, i + 2, "AND"))
      s.push_back('&'), i += 2;
    else if(check(i, i + 1, "OR"))
      s.push_back('|'), i += 1;
    else if(check(i, i + 3, "TRUE"))
      s.push_back('1'), i += 3;
    else if(check(i, i + 4, "FALSE"))
      s.push_back('0'), i += 4;
    else if('A' <= a[i] && a[i] <= 'Z')
      s.push_back('0'), p[s.size() - 1] = a[i];
    else
      s.push_back(a[i]);
  }
  cin >> q;
  for(; q; q--) {
    cin >> ch;
    for(int j = 0; j < s.size(); j++) {
      if(p[j] == ch) {
        if(s[j] == '1')
          s[j] = '0';
        else
          s[j] = '1';
      }
    }
    i = 0;
    cout << eval(0);
  }
  return 0;
}