Cod sursa(job #1989802)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 8 iunie 2017 22:28:22
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>

const int MAXN = 1e3;
#define MAXC 26

char s[MAXN + 10];
int v[MAXC];
int cursor;

int expr();

int fact() {
  int x;
  if ((s[cursor] == 'N') && (s[cursor + 1] == 'O') && (s[cursor + 2] == 'T')) {
    cursor += 3;
    x = !fact();
  } else if (s[cursor] == '(') {
    ++cursor;
    x = expr();
    ++cursor;
  } else if ((s[cursor] == 'T') && (s[cursor + 1] == 'R') && (s[cursor + 2] == 'U') && (s[cursor + 3] == 'E')) {
    cursor += 4;
    x = 1;
  } else if ((s[cursor] == 'F') && (s[cursor + 1] == 'A') && (s[cursor + 2] == 'L') && (s[cursor + 3] == 'S') && (s[cursor + 4] == 'E')) {
    cursor += 5;
    x = 0;
  } else {
    x = v[s[cursor++] - 'A'];
  }
  return x;
}

int term() {
  int x = fact();
  while ((s[cursor] == 'A') && (s[cursor + 1] == 'N') && (s[cursor + 2] == 'D')) {
    cursor += 3;
    x &= fact();
  }
  return x;
}

int expr() {
  int x = term();
  while ((s[cursor] == 'O') && (s[cursor + 1] == 'R')) {
    cursor += 2;
    x |= term();
  }
  return x;
}

int main() {
  int n, p;
  char ch;
  FILE *fin = fopen("bool.in", "r");
  ch = fgetc(fin);
  p = 0;
  while (ch != '\n') {
    if (ch != ' ') {
      s[p++] = ch;
    }
    ch = fgetc(fin);
  }
  fscanf(fin, "%d ", &n);
  FILE *fout = fopen("bool.out", "w");
  for (int i = 0; i < n; ++i) {
    ch = fgetc(fin);
    cursor = 0;
    v[ch - 'A'] = !v[ch - 'A'];
    fprintf(fout, "%d", expr());
  }
  fclose(fin);
  fclose(fout);
  return 0; 
}