Cod sursa(job #2393266)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 31 martie 2019 11:13:30
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

const int N = 1000 + 7;
char s[N];
int n;
bool value[26];
int v[N], y = 0;

/// "(" = -1
/// ")" = -2
/// "AND" = -3
/// "OR" = -4
/// "NOT" = -5
/// "TRUE" = -6
/// "FALSE" = -7

int p;

bool expresie();
bool termen();
bool factor();

bool expresie()
{
  bool a = termen();
  while(v[p] == -4)
  {
    p++;
    a |= termen();
  }
  return a;
}

bool termen()
{
  bool a = factor();
  while(v[p] == -3)
  {
    p++;
    a &= factor();
  }
  return a;
}

bool factor()
{
  bool inv = 0;
  if(v[p] == -5)
  {
    inv = 1;
    p++;
  }
  if(v[p] == -1)
  {
    p++;
    bool res = expresie();
    p++;
    return (res ^ inv);
  }
  bool res;
  if(v[p] == -6)
  {
    res = 1;
  }
  if(v[p] == -7)
  {
    res = 0;
  }
  if(0 <= v[p])
  {
    res = value[v[p]];
  }
  p++;
  return (res ^ inv);
}

bool calc()
{
  p = 0;
  return expresie();
}

int main()
{
  freopen("bool.in", "r", stdin);
  freopen("bool.out", "w", stdout);
  cin.getline(s, N);
  n = strlen(s);
  for(int i = 0; i < n;)
  {
    if(s[i] == '(')
    {
      v[++y] = -1;
      i++;
      continue;
    }
    if(s[i] == ')')
    {
      v[++y] = -2;
      i++;
      continue;
    }
    if(s[i] == 'A' && s[i + 1] == 'N' && s[i + 2] == 'D')
    {
      v[++y] = -3;
      i += 3;
      continue;
    }
    if(s[i] == 'O' && s[i + 1] == 'R')
    {
      v[++y] = -4;
      i += 2;
      continue;
    }
    if(s[i] == 'N' && s[i + 1] == 'O' && s[i + 2] == 'T')
    {
      v[++y] = -5;
      i += 3;
      continue;
    }
    if(s[i] == 'T' && s[i + 1] == 'R' && s[i + 2] == 'U' && s[i + 3] == 'E')
    {
      v[++y] = -6;
      i += 4;
      continue;
    }
    if(s[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' && s[i + 3] == 'E')
    {
      v[++y] = -7;
      i += 4;
      continue;
    }
    if('A' <= s[i] && s[i] <= 'Z')
    {
      v[++y] = (s[i] - 'A');
    }
    i++;
  }
  n = y;
  int q;
  cin >> q;
  string c;
  cin >> c;
  for(auto &x : c)
  {
    int y = x - 'A';
    value[y] ^= 1;
    cout<<(calc());
  }
  cout<<"\n";
  return 0;
}