Cod sursa(job #2969054)

Utilizator Alex_HossuHossu Alexandru Alex_Hossu Data 22 ianuarie 2023 15:16:01
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <bits/stdc++.h>
using namespace std;

const int MAX_LETT = 30;

string line, lineAux;
string line1;

string line2;

int letter[MAX_LETT];

int pos;

int expresie();
int factor();

int expresie() {
  int val = factor();
  if (line1[pos] == '$' || line1[pos] == '%') {
    if (line1[pos] == '$') {
      pos++; val = val & factor();
    } else {
      pos++; val = val | factor();
    }
  }
  return val;
}

int factor() {
  int sign = 0; int val;

  while (line1[pos] == '!') {
    sign = 1; pos++;
  }
  if (line1[pos] == '(') {
    pos++; val = expresie(); pos++;
    return (sign + val) % 2;
  }
  return (sign + letter[line1[pos++] - 'A']) % 2;
}

int main() {
  ifstream fin;
  ofstream fout;

  int n;
  int i, j;
  char ch;

  fin.open("bool.in");
  fout.open("bool.out");

  getline(fin, line);

  fin >> n;
  for (i = 0; i < n; i++) {
    do {
      fin.get(ch);
    } while (!isalpha(ch));
    line2.push_back(ch);
  }

  j = 0; lineAux.resize((int)line.size());
  for (i = 0; i < (int)line.size(); i++) {
    lineAux[j++] = line[i];
    if (j > 2) {
      if (lineAux[j - 1] == 'D' && lineAux[j - 2] == 'N' && lineAux[j - 3] == 'A') {
        j = j - 3; lineAux[j] = '$'; j++;
      }
      if (lineAux[j - 1] == 'R' && lineAux[j - 2] == 'O') {
        j = j - 2; lineAux[j] = '%'; j++;
      }

      if (lineAux[j - 1] == 'T' && lineAux[j - 2] == 'O' && lineAux[j - 3] == 'N') {
        j = j - 3; lineAux[j] = '!'; j++;
      }

      if (lineAux[j - 1] == 'E' && lineAux[j - 2] == 'U' && lineAux[j - 3] == 'R' && lineAux[j - 4] == 'T') {
        j = j - 4; lineAux[j] = '*'; j++;
      }
      if (lineAux[j - 1] == 'E' && lineAux[j - 2] == 'S' && lineAux[j - 3] == 'L' && lineAux[j - 4] == 'A' && lineAux[j - 5] == 'F') {
        j = j - 5; lineAux[j] = '^'; j++;
      }
    }
  }

  line1.resize((int)lineAux.size()); i = 0; j = 0;
  while (i < (int)lineAux.size()) {
    while (isspace(ch = lineAux[i]))
      i++;
    line1[j++] = lineAux[i];
    i++;
  }

  //for (int i = 0; i < (int)line1.size(); i++)
    //cout << line1[i];

  for (i = 0; i < n; i++) {
    pos = 0; letter[line2[i] - 'A'] = (letter[line2[i] - 'A'] + 1) % 2;
    fout << expresie();
  }

  //fout << n;
  //fout << '\n';
  //fout << (int)lineAux.size();
  //fout << '\n';
  /*  fout << '\n';
  fout << (int)lineAux.size();
  for (int i = 0; i < (int)line2.size(); i++)
    fout << line2[i];
  fout << '\n'; */

  fin.close();
  fout.close();

  return 0;
}