Cod sursa(job #2923891)

Utilizator AlexandruBenescuAlexandru Benescu AlexandruBenescu Data 20 septembrie 2022 16:44:32
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <bits/stdc++.h>
#define ALPHA 30
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");

bool v[ALPHA];
int s_length;

bool expresie(const char* s, int& p);
bool termen(const char* s, int& p);
bool factor(const char* s, int& p);
bool numar(const char* s, int& p);

bool expresie(const char* s, int& p){
  bool res = termen(s, p);
  while (p < s_length && s[p] == '|'){
    p++;
    res |= termen(s, p);
  }
  return res;
}

bool termen(const char* s, int& p){
  bool res = factor(s, p);
  while (p < s_length && s[p] == '&'){
    p++;
    res &= factor(s, p);
  }
  return res;
}

bool factor(const char* s, int& p){
  bool res, sign = false;
  while (s[p] == '!'){
    sign ^= 1;
    p++;
  }
  if (s[p] == '('){
    p++;
    res = (sign ^ expresie(s, p));
    p++;
  }
  else
    res = (sign ^ numar(s, p));
  return res;
}

bool numar(const char* s, int& p){
  bool res;
  if (s[p] == '1')
    res = true;
  else if (s[p] == '0')
    res = false;
  else
    res = v[s[p] - 'A'];
  p++;
  return res;
}

int main(){
  string s, sq, str;
  int q, p, i, lg;
  getline(fin, s);
  s_length = s.size();
  str = s;
  lg = 1;
  for (i = 1; i < s_length; i++)
    if (s[i - 1] == 'O' && s[i] == 'R'){
      lg--;
      str[lg++] = '|';
    }
    else
      str[lg++] = s[i];
  s_length = lg;
  s = str;
  lg = 2;
  for (i = 2; i < s_length; i++)
    if (s[i - 2] == 'A' && s[i - 1] == 'N' && s[i] == 'D'){
      lg -= 2;
      str[lg++] = '&';
    }
    else
      str[lg++] = s[i];
  s_length = lg;
  s = str;
  lg = 2;
  for (i = 2; i < s_length; i++)
    if (s[i - 2] == 'N' && s[i - 1] == 'O' && s[i] == 'T'){
      lg -= 2;
      str[lg++] = '!';
    }
    else
      str[lg++] = s[i];
  s_length = lg;
  s = str;
  lg = 3;
  for (i = 3; i < s_length; i++)
    if (s[i - 3] == 'T' && s[i - 2] == 'R' && s[i - 1] == 'U' && s[i] == 'E'){
      lg -= 3;
      str[lg++] = '1';
    }
    else
      str[lg++] = s[i];
  s_length = lg;
  s = str;
  lg = 4;
  for (i = 4; i < s_length; i++)
    if (s[i - 4] == 'F' && s[i - 3] == 'A' && s[i - 2] == 'L' && s[i - 1] == 'S' && s[i] == 'E'){
      lg -= 4;
      str[lg++] = '0';
    }
    else
      str[lg++] = s[i];
  s_length = lg;
  s = str;
  lg = 0;
  for (i = 0; i < s_length; i++)
    if (!isspace(s[i]))
      str[lg++] = s[i];
  s_length = lg;
  s = str;

  for (i = 0; i < s_length; i++)
    cout << s[i];

  fin >> q >> sq;
  for (i = 0; i < q; i++){
    v[sq[i] - 'A'] ^= 1;
    p = 0;
    fout << expresie(s.c_str(), p);
  }
  fout << "\n";
  return 0;
}