Cod sursa(job #1233190)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 24 septembrie 2014 21:58:10
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.61 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;
int n, i, m, q;
bool bl, v[105];
char ch, s[1005], e[1005];

bool cond(int x)
{
    if(s[x]=='('||s[x]==')') return 1;
    if(s[x]==' ') return 1;
    if(s[x]>='A'&&s[x]<='Z') return 1;
    return 0;
}



bool eval();
bool evalAND(bool x);
bool evalNOT(int x);

int main()
{
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    gets(s+1);
    m=1;
    while(cond(m)) m++;
    q=0;
    for(i=1;i<=m;i++)
    {
        if(s[i]=='A'&&s[i+1]=='N'&&s[i+2]=='D')
        {
            e[++q]='&';
            i+=2;
        }
        else if(s[i]=='O'&&s[i+1]=='R')
        {
            e[++q]='|';
            i++;
        }
        else if(s[i]=='N'&&s[i+1]=='O'&&s[i+2]=='T')
        {
            e[++q]='!';
            i+=2;
        }
        else if(s[i]=='F'&&s[i+1]=='A')
        {
            e[++q]='0';
            i+=4;
        }
        else if(s[i]=='T'&&s[i+1]=='R')
        {
            e[++q]='1';
            i+=3;
        }
        else if(s[i]==' ') continue;
        else e[++q]=s[i];
    }
    scanf("%d\n", &n);
    while(n--)
    {
        scanf("%c", &ch);
        v[ch-'A']^=1;
        i=0;
        printf("%d", eval());
    }

    return 0;
}

bool eval()
{
    int total=-1;
    int x=0;
    //int i=1;
    bool bulaneala=false;
    while(i<=q)
    {
        i++;
        if(x==0) bulaneala=false;
        else bulaneala=true;

        if(e[i]>='A'&&e[i]<='Z')
        {
            if(v[e[i]-'A']==1) x=1;
            else x=0;
            continue;
        }
        if(e[i]=='(')
        {
            x=eval();
            continue;
        }
        if(e[i]==')')
        {
            break;
        }
        if(e[i]=='|')
        {
            if(total==-1) total=x;
            else total|=x;
            continue;
        }
        if(e[i]=='&')
        {

            x=evalAND(bulaneala);
            continue;
        }
        if(e[i]=='!')
        {
            i++;
            x=evalNOT(i);
            continue;
        }
        if(e[i]=='1')
        {
            x=1;
            continue;
        }
        if(e[i]=='0')
        {
            x=0;
            continue;
        }
    }
    if(total==-1) total=x;
    else total|=x;

    if(total==1) return true;
    return false;
}

bool evalAND(bool x)
{
    bool total=x;
    bool y=false;
    while(i<=q)
    {
        i++;

        if(e[i]==')')
        {
            i--;
            break;
        }
        if(e[i]=='(')
        {
            y=eval();
            continue;
        }
        if(e[i]=='&')
        {
            total&=y;
            continue;
        }
        if(e[i]>='A'&&e[i]<='Z')
        {
            y=v[e[i]-'A'];
            continue;
        }
        if(e[i]=='|')
        {
            i--;
            break;
        }
        if(e[i]=='!')
        {
            i++;
            y=evalNOT(i);
            continue;
        }
        if(e[i]=='1')
        {
            y=true;
            continue;
        }
        if(e[i]=='0')
        {
            y=false;
            continue;
        }
    }
    total&=y;

    return total;
}

bool evalNOT(int x)
{
    bool boolaneala=false;

    if(e[x]=='1') boolaneala=false;
    else if(e[x]=='0') boolaneala=true;
    else if(e[x]=='(') boolaneala=eval();
    else boolaneala=v[e[x]-'A'];
    return boolaneala^1;
}