Cod sursa(job #551444)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 10 martie 2011 19:42:29
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include<stdio.h>
#include<string.h>
#define Nmax 1100

int n=0,i,j,b[Nmax],nr,val[Nmax];
char a[Nmax],x,s[Nmax],*p=s;

int exp();
int f();
int t();


void initializare()
{
    int q=0;
    for(int i=0;s[i];i++)
    {
        if(s[i]==' ') continue;
		if(s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E')
        {
            i+=3;
            a[++q]=1;continue;
        }
        if(s[i]=='F' && s[i+1]=='A' && s[i+2]=='L' && s[i+3]=='S' && s[i+4]=='E')
        {
            i+=4;
            a[++q]=0;continue;
        }
        if(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
        {
            i+=2;
            a[++q]='!';continue;
        }
        if(s[i]=='O' && s[i+1]=='R')
        {
            i+=1;
            a[++q]='|';continue;
        }
        if(s[i]=='A' && s[i+1]=='N' && s[i+2]=='D')
        {
            i+=2;
            a[++q]='&';continue;
        }
        if(s[i]=='(')
        {
            a[++q]='(';continue;
        }
        if(s[i]==')')
        {
            a[++q]=')';continue;
        }
        a[++q]=s[i];
    }
}


int eval()
{
	int semn=f();
	
	while (a[i]=='|')
	{
		i++;
		semn|=f();
	}
	return semn;
	
}

int f()
{
	int semn=t();
	
	while (a[i]=='&')
	{
		i++;
		semn&=t();
	}
	return semn;
}

int t()
{
	int semn=1;
	
	while (a[i]=='!')
	{
		if (semn==0) semn=1;
			else semn=0;
		i++;
	}
	if (a[i]=='(')
	{
		i++;
		int r=eval();
		i++;
		if (semn==1) return r;
		return (!r);
	}
	
	int r;
	if (a[i]=='0') r=0;
	if (a[i]=='1') r=1;
	if (a[i]!='0'&&a[i]!='1') r=val[a[i]];
	i++;
	if (semn==1) return r;
	return (!r);
}


int main()
{
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	
	gets(s);
	initializare();
	
	scanf("%d\n",&nr);
	
	for (int ii=1;ii<=nr;ii++)
	{
		scanf("%c",&x);
		if (val[x]==0) val[x]=1;
			else val[x]=0;
 		i=1;
		printf("%d",eval());
	}
	return 0;
}