Cod sursa(job #1496495)

Utilizator Vlad_317Vlad Panait Vlad_317 Data 5 octombrie 2015 02:42:25
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <stdio.h>

using namespace std;

char s[10001], q=0;
bool val[30];

/// e = t OR t OR t
/// t=f AND f AND f AND f
/// f=(e)|variabila|NOT vatiabila

///NOT>AND>OR

void skip()
{
    while(s[q]==' ')
        q++;
}

bool E();
bool T();
bool F();

bool E()
{
    skip();
    bool raspuns=T();
    skip();
    while(s[q]=='O' && s[q+1]=='R')
    {
        q+=2;
        skip();
        bool tmp = T();
        raspuns=(raspuns || tmp);
        skip();
    }

    return raspuns;
}

bool T()
{
    skip();
    bool raspuns=F();
    skip();
    while(s[q]=='A' && s[q+1]=='N')
    {
        q+=3;
        skip();
        bool tmp = F();
        raspuns=(raspuns && tmp);
        skip();
    }
    return raspuns;
}

bool F()
{
    skip();
    bool raspuns = 0;
    if(s[q]=='(')
    {
        q++;
        skip();
        raspuns = E();
        skip();
        q++;
        return raspuns;
    }
    if(s[q]=='N' && s[q+1]=='O')
    {
        q+=3;
        skip();
        raspuns=!F();
        return raspuns;
    }
    if(s[q]=='T' && s[q+1]=='R')
    {
        q+=4;
        skip();
        return 1;
    }
    if(s[q]=='F' && s[q+1]=='A')
    {
        q+=5;
        skip();
        return 0;

    }
    if(val[s[q]-'A'] == 0)
    {
        q++;
        skip();
        return 0;
    }
    if(val[s[q]-'A'] == 1)
    {
        q++;
        skip();
        return 1;
    }
}


int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);

    gets(s);

    int n;

    scanf("%d\n", &n);

    for(int i=1; i<=n; i++)
    {
        char c;
        scanf("%c",&c);
        val[c-'A']=!val[c-'A'];
        q=0;
        printf("%d",E());
    }



    return 0;
}