Cod sursa(job #275472)

Utilizator EllsolanMircea Iordache Ellsolan Data 10 martie 2009 14:46:32
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>
#include <cstring>
using namespace std;
char tmp[2000], ed[2000];
unsigned int i,n;
bool A['z'-'a'+2];

bool eval();
void filter()
{
    unsigned int n=0;
    for (i=0;tmp[i]!='\n';i++)
    if (tmp[i]!=' ') ed[n++]=tmp[i];
}

int main()
{
    freopen ("bool.in", "r", stdin);
    freopen ("bool.out","w",stdout);
    char c;
    fgets(tmp, 200, stdin);
    filter();
    for (i=0;i<='z'-'a'+1;i++)
    A[i]= false;
    scanf("%d\n",&n);
    while (n--)
    {
	scanf("%c",&c);
	A[c-'A']=!A[c-'A'];
	i=0;
	printf("%d", eval()?1:0);
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}

bool ev1();
bool ev2();

bool eval()
{
    bool mem=ev1();
    while ( strncmp(i+ed, "OR", 2)==0)
    {
        i+=2;
        mem |= ev1();
    }
    return mem;
}

bool ev1()
{
    bool mem=ev2();
    while (strncmp(i+ed, "AND", 3)==0)
    {
        i+=3;
        mem&=ev2();
    }
    return mem;
}

bool ev2()
{
    bool mem;
    if (strncmp(i+ed, "TRUE", 4)==0)
    {
        i+=4;
        return true;
    }
    if (strncmp(i+ed, "FALSE", 5)==0)
    {
        i+=5;
        return false;
    }
    if (strncmp (i+ed, "NOT", 3)==0)
    {
        i+=3;
        mem=!ev2();
    }
    else
    {
        if (ed[i]=='(')
        {
            i++;
            mem=eval();
            i++;
        }
        else
            mem=A[ed[i++]-'A'];
    }
    return mem;
}