Cod sursa(job #1464492)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 23 iulie 2015 17:29:09
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.54 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);
    prelucrare();
    f>>N;
    FOR (i,1,N) {
        char x;
        f>>x;
        int nr=x-'A';
        val[nr]=!val[nr];
        char *p=sir;
        g<<eval(p);
    }
    f.close();g.close();
    return 0;
}

bool eval(char*& p) {
    bool rez=termen(p);
    while (*p=='|') {
        ++p;
        bool da=termen(p);
        rez=(rez || da);
    }
    return rez;
}

bool termen(char*& p) {
    bool rez=factor(p);
    while (*p=='&') {
        ++p;
        bool da=factor(p);
        rez=(rez && da);
    }
    return rez;
}

bool factor(char*& p) {
    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') {
            p=p+4;
            if (neg) {
                return false;
            }
            else {
                return true;
            }
        }
        else if (*p=='F' && *(p+1)=='A') {
            p=p+5;
            if (neg) {
                return true;
            }
            else {
                return false;
            }
        }
        else {
            int nr=first-'A';
            ++p;
            if (neg) {
                return !val[nr];
            }
            return val[nr];
        }
    }
}

inline void prelucrare() { // prelucrez expresia data astfel incat "NOT" = "!", "OR"="|", "AND"="&" si nu exista spatii
    int contor;
    char word[4]={"NOT"};
    contor=0;
    FOR (i,0,dimsirorig-1) {
        if (word[contor]==sirorig[i]) {
            ++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]) {
            ++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]) {
            ++contor;
            if (contor==3) {
                sirorig[i]=' ';
                sirorig[i-1]=' ';
                sirorig[i-2]='&';
                contor=0;
            }
        }
        else {
            contor=0;
        }
    }
    FOR (i,0,dimsirorig-1) {
        if (sirorig[i]!=' ') {
            sir[dimsir++]=sirorig[i];
        }
    }
}