Cod sursa(job #2208121)

Utilizator PetyAlexandru Peticaru Pety Data 28 mai 2018 12:59:05
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("bool.in");
ofstream fout ("bool.out");

int f[28], n;
string s;
char ch;

void skip(char* &s) {
  while (*s == ' ')
    s++;
}

bool Expresie(char* &s);

bool Termen(char* &s) {
  if (*s == 'T' && *(s + 1) == 'R' && *(s + 2) == 'U' && *(s + 3) == 'E') {
    s += 4;
    return 1;
  }
  else if (*s == 'F' && *(s + 1) == 'A' && *(s + 2) == 'L' && *(s + 3) == 'S' && *(s + 4) == 'E') {
    s += 5;
    return 0;
  }
  else if (*s == '(') {
    s++;
    Expresie(s);
    s++;
  }
  else if (isalpha(*s))
    return f[*s - 'A'];
}

bool Not (char* &s) {
  bool nu = 0;
  skip(s);
  while  (*s == 'N' && *(s + 1) == 'O' && *(s + 2) == 'T') {
    s += 3;
    nu = 1 - nu;
    skip(s);
  }
  if (nu == 0)
    return Termen(s);
  else
    return 1 - Termen(s);
}

bool ands (char* &s) {
  bool val = Not(s);
  skip(s);
  while (*s == 'A' && *(s + 1) == 'N' && *(s + 2) == 'D') {
    s += 3;
    skip(s);
    val &= Not(s);
    skip(s);
  }
  return val;
}

bool Expresie (char* &s) {
  bool val = ands(s);
  skip(s);
  while (*s == 'O' && *(s + 1) == 'R') {
    s += 2;
    skip(s);
    val |= ands(s);
    skip(s);
  }
  return val;
}

int main()
{
  while (fin.get(ch)) {
    if (ch == '\n')
      break;
    s += ch;
  }
  s += '\0';
  fin >> n;
  for (int i = 1; i <= n; i++) {
    fin >> ch;
    f[ch - 'A'] = 1 - f[ch - 'A'];
    char *sir = &s[0];
    fout << Expresie(sir);
  }
  return 0;
}