Cod sursa(job #3312464)

Utilizator boboc132Boboc Teodor boboc132 Data 28 septembrie 2025 14:56:15
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>
 using namespace std;
 ifstream fin ("bool.in");
 ofstream fout("bool.out");
 char s[1005], t[1005];
 int i, k, n;
 int F[130];
 char c;
 int expresieOr();
 int expresieAnd();
 int expresieXor();
 int factor();
 /// functia pentru tratarea separarii prin operatorul
 /// de prioritate minima
 int expresieOr() {
 int r = expresieAnd();
 while (t[i] == '|') {
 i++;
 r = (r | expresieAnd());
 }
 return r;
 }
 int expresieAnd() {
 int r = expresieXor();
 while (t[i] == '&') {
 i++;
 r = (r & expresieXor());
 }
 return r;
 }
 int expresieXor() {
 int r = factor();
 while (t[i] == '^') {
 i++;
 r = (r^factor());
 }
 return r;
 }
 int factor() {
 int r;
 /*
 Factorii pot fi de trei tupuri:
 (expresie)
 constanta 0 sau 1
 o variabila a carei valoare o extragem din vectorul f
 */
 if (t[i] == '(') {
 i++;
 r = expresieOr();
 i++;
 } else {
 if (t[i] =='0') {
 i++;
 return 0;
 }
 if (t[i] == '1') {
 i++;
 return 1;
 }
 return F[ t[i++] ];
 }
 return r;
 }
 int main () {
 fin.get(s, 1002); /// citire sir care poate contine si spatii
 fin.get();
 /// parsarea lui s pentru si obtinerea sirului simplificat t
 for (i=0;s[i]!=0;i++) {
 if (s[i] == ' ')
 continue;
 if (s[i] == '(' || s[i] == ')') {
 t[k++] = s[i];
 continue;
 }
 if (s[i] == 'T' && s[i+1] == 'R') {
 t[k++] = '1';
 i+=3;
 continue;
 }
 if (s[i]== 'F' && s[i+1] == 'A') {
 t[k++] = '0';
 i+=4;
 continue;
 }
 if (s[i] == 'O' && s[i+1] == 'R') {
 t[k++] = '|';
 i++;
 continue;
 }
 if (s[i]=='A' && s[i+1] == 'N') {
 t[k++] = '&';
 i+=2;
 continue;
 }
 if (s[i] == 'N' && s[i+1] == 'O') {
 t[k++] = '1';
 t[k++] = '^';
 i+=2;
 continue;
 }
 t[k++] = s[i];
 }
 fin>>n;
 for (int j=1;j<=n;j++) {
 fin>>c;
 //F[c] = !F[c];
 F[c] = 1 - F[c]; /// se trece din 1 în 0 si din 0 in 1
 i = 0;
 fout<<expresieOr();
 }
 return 0;
 }