Pagini recente » Cod sursa (job #2309758) | Cod sursa (job #794404) | Monitorul de evaluare | Cod sursa (job #848388) | Cod sursa (job #1464490)
#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cstring>
#include<queue>
#define ull unsigned long long
#define ll long long
#define pb push_back
#define FOR(a,b,c) for (int a=b;a<=c; ++a)
#define ROF(a,b,c) for (int a=b;a>=c; --a)
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
int N,dimsirorig,dimsir; // vezi a treia metoda de rezolvare de la problema evaluare pentru explicatii
bool val[105];
char sirorig[1010],sir[1010];
inline void prelucrare();
bool eval(char*&);
bool termen(char*&);
bool factor(char*&);
int main()
{
f.getline(sirorig,1005);
dimsirorig=strlen(sirorig);
//cout<<sirorig<<'\n';
prelucrare();
f>>N;
//g<<eval();
/*for (char c='A';c<='D';++c) {
int nr=c-'A';
cout<<c<<' '<<val[nr]<<'\n';
}
cout<<'\n';*/
FOR (i,1,N) {
char x;
f>>x;
int nr=x-'A';
//cout<<x<<' '<<nr<<'\n';;
val[nr]=!val[nr];
/*for (char c='A';c<='D';++c) {
int nr=c-'A';
cout<<c<<' '<<val[nr]<<'\n';
}
cout<<'\n';*/
char *p=sir;
//cout<<*p<<"\n\n";
g<<eval(p);
}
//bool A=true,B=false;
//cout<<(A&&B)<<' '<<(A||B);
f.close();g.close();
return 0;
}
bool eval(char*& p) {
//cout<<"EVAL "<<*p<<" \n";
bool rez=termen(p);
//cout<<"EVAL "<<*p<<" \n";
while (*p=='|') {
++p;
bool da=termen(p);
rez=(rez || da);
//cout<<"EVAL "<<*p<<" \n";
}
return rez;
}
bool termen(char*& p) {
//cout<<"TERMEN "<<*p<<" \n";
bool rez=factor(p);
//cout<<"TERMEN "<<*p<<" \n";
while (*p=='&') {
++p;
bool da=factor(p);
rez=(rez && da);
//cout<<"TERMEN "<<*p<<" \n";
}
return rez;
}
bool factor(char*& p) {
//cout<<"FACTOR "<<*p<<" \n";
bool neg=false;
while (*p=='!') {
neg=!neg;
++p;
}
if (*p=='(') {
bool rez;
++p;
rez=eval(p);
++p;
if (neg) {
return !rez;
}
else {
return rez;
}
}
else {
char first=*p;
if (*p=='T' && *(p+1)=='R') {
//cout<<"TRUE\n";
p=p+4;
if (neg) {
return false;
}
else {
return true;
}
}
else if (*p=='F' && *(p+1)=='A') {
//cout<<"FALSE\n";
p=p+5;
if (neg) {
return true;
}
else {
return false;
}
}
else {
int nr=first-'A';
++p;
//cout<<first<<' '<<val[nr]<<'\n';
if (neg) {
return !val[nr];
}
return val[nr];
}
}
}
inline void prelucrare() {
int contor;
char word[4]={"NOT"};
contor=0;
FOR (i,0,dimsirorig-1) {
if (word[contor]==sirorig[i]) {
//cout<<word[contor]<<' '<<sirorig[i]<<' '<<i<<'\n';
++contor;
if (contor==3) {
sirorig[i]=' ';
sirorig[i-1]=' ';
sirorig[i-2]='!';
contor=0;
}
}
else {
contor=0;
}
}
word[0]='O';
word[1]='R';
contor=0;
FOR (i,0,dimsirorig-1) {
if (word[contor]==sirorig[i]) {
//cout<<word[contor]<<' '<<sirorig[i]<<' '<<i<<'\n';
++contor;
if (contor==2) {
sirorig[i]=' ';
sirorig[i-1]='|';
contor=0;
}
}
else {
contor=0;
}
}
word[0]='A';
word[1]='N';
word[2]='D';
contor=0;
FOR (i,0,dimsirorig-1) {
if (word[contor]==sirorig[i]) {
//cout<<word[contor]<<' '<<sirorig[i]<<' '<<i<<'\n';
++contor;
if (contor==3) {
sirorig[i]=' ';
sirorig[i-1]=' ';
sirorig[i-2]='&';
contor=0;
}
}
else {
contor=0;
}
}
//cout<<sirorig<<'\n';;
FOR (i,0,dimsirorig-1) {
if (sirorig[i]!=' ') {
sir[dimsir++]=sirorig[i];
}
}
//cout<<sir<<'\n';
}