Cod sursa(job #1209746)

Utilizator mihaimusatMihai Musat mihaimusat Data 18 iulie 2014 14:34:39
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <fstream>

using namespace std;

ifstream f("bool.in");
ofstream g("bool.out");

char c[1020], s[1020], m[110], *p;
int i,k,n,j;
int ok[100];

int expresie ();
int termen ();
int factor1 ();
int factor2 ();

int expresie () {
    int r=termen ();
    while (*p== '|' ) {
        p++;
        r |= termen();
    }
    return r;
}

int termen () {
    int r=factor1 ();

    while (*p=='&') {
        p++;
        r &= factor1();
    }
    return r;
}

int factor1 () {
    int r=factor2();
    if (*p=='!') {
        p++;
        if (r!=2)
            r=(!factor2());
        else
            r=(!factor1());

    }
    return r;
}

int factor2 (){
    int r;
    if (*p=='(') {
        p++;
        r=expresie();
        p++;
    }else {
        if (*p>='A' && *p<='Z' ) {
            r=ok[*p-'A'];
            p++;
        }else {
            r=*p-'0';
            p++;
        }
    }
    return r;
}

int main () {
    f.get (s,1010);
    f.get ();
    k=-1;
    i = 0;
    for (;s[i]!=0;)
    {
        if (((s[i]>='A'&&s[i]<='Z'))&& !(s[i+1]>='A'&&s[i+1]<='Z'))
        {
            c[++k]=s[i];
            i++;

        }
        else
        if (s[i]=='N')
        {
            c[++k]='2';
            c[++k]='!';
            i+=3;
        }
        else
        if (s[i]=='T')
        {
            c[++k]='1';
            i+=4;
        }
        else
        if (s[i]=='F')
        {
            c[++k]='0';
            i+=5;
        }
        else
        if (s[i]=='(')
        {
            c[++k]='(';
            i++;
        }
        else
        if (s[i]==')')
        {
            c[++k]=')';
            i++;
        }
        else
        if (s[i]=='O')
        {
            c[++k]='|';
            i+=2;
        }
        else
        {
            if (s[i]=='A')
            {
                c[++k]='&';
                i+=3;
            }
            else
                i++;
        }
    }
    f>>n;
    f>>m;
    for (j=0;j<n;j++) {
        ok[m[j]-'A']=(ok[m[j]-'A']^1);
        p=c;
        g<<expresie();
    }
    return 0;
}