Cod sursa(job #1464490)

Utilizator MaligMamaliga cu smantana Malig Data 23 iulie 2015 17:25:36
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.48 kb
#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';
}