Cod sursa(job #2923883)

Utilizator AlexandruBenescuAlexandru Benescu AlexandruBenescu Data 20 septembrie 2022 12:17:39
Problema Bool Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 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 ^= true;
    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 = 0;
  getline(fin, s);
  s_length = s.size();
  str = s;
  for (i = 0; i < s_length; i++)
    if (!isspace(s[i]))
      str[lg++] = s[i];
  s_length = lg;
  s = str;

  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;
}