Cod sursa(job #1121538)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 25 februarie 2014 13:10:04
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <cstring>
#include <fstream>

using namespace std;

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

int var['Z'-'A'+1];
char s[1000];
int l;
int p;

int expresie();
int termen();
int factor();

int expresie()
{
    int val=termen();
    while(p+1<l && s[p]=='O' && s[p+1]=='R')
    {
        p+=3;
        val=val | termen();
    }
    return val;
}

int termen()
{
    int val=factor();
    while(p+2<l && s[p]=='A' && s[p+1]=='N' && s[p+2]=='D')
    {
        p+=4;
        val=val & factor();
    }
    return val;
}

int factor()
{
    int semn=1,val=0;
    if(p+2<l && s[p]=='N' && s[p+1]=='O' && s[p+2]=='T')
        while(p+2<l && s[p]=='N' && s[p+1]=='O' && s[p+2]=='T')
        {
            p+=4;
            semn=-semn;
        }
    if(p+3<l && s[p]=='T' && s[p+1]=='R' && s[p+2]=='U' && s[p+3]=='E')
    {
        p+=5;
        val=1;
        if(semn==1)
            return val;
        return 1-val;
    }
    if(p+4<l && s[p]=='F' && s[p+1]=='A' && s[p+2]=='L' && s[p+3]=='S' && s[p+4]=='E')
    {
        p+=6;
        val=0;
        if(semn==1)
            return val;
        return 1-val;
    }
    if(s[p]=='(')
    {
        p++;
        val=expresie();
        p++;
        if(semn==1)
            return val;
        return 1-val;
    }
    val=var[s[p]-'A'];
    if(semn==1)
        return val;
    return 1-val;
}

int main()
{
    int n;
    in.get(s,sizeof(s));
    l=strlen(s);
    in>>n;
    int i;
    char c;
    for(i=1;i<=n;i++)
    {
        in>>c;
        var[c-'A']=1-var[c-'A'];
        p=0;
        int q=expresie();
        out<<q;
    }
    return 0;
}