Cod sursa(job #549515)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 8 martie 2011 18:27:31
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include<stdio.h>
#include<string.h>
#define Nmax 1009

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()
{
	while ((*p>='A'&&*p<='Z')||(*p==')')||(*p=='(')||(*p==' '))
	{
		if (*p==' ')
			p++;
		else if (*p=='T'&&*(p+1)=='R'&&*(p+2)=='U'&&*(p+3)=='E')
		{
			p+=4;
			a[++n]='1';
		}
		else if (*p=='F'&&*(p+1)=='A'&&*(p+3)=='L'&&*(p+4)=='S'&&*(p+5)=='E')
		{
			p+=5;
			a[++n]='0';
		}
		else if ((*p)=='O'&&*(p+1)=='R')
		{
			p+=2;
			a[++n]='|';
		}
		else if ((*p)=='N'&&*(p+1)=='O'&&*(p+2)=='T')
		{
			p+=3;
			a[++n]='!';
		}
		else if ((*p)=='A'&&*(p+1)=='N'&&*(p+2)=='D')
		{
			p+=3;
			a[++n]='&';
		}
		else if (*p=='(')
		{
			p++;
			a[++n]='(';
		}
		else if (*p==')')
		{
			p++;
			a[++n]=')';
		}
		else
		{
			a[++n]=*p;
			p++;
		}
	}
	a[n]='\0';
}

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=0;
	
	while (a[i]=='!')
	{
		semn=(semn*-1)+1;
		i++;
	}
	if (a[i]=='(')
	{
		i++;
		semn=eval();
		i++;
	}
	else
	{
		if (a[i]=='0') semn=0;
		if (a[i]=='1') semn=1;
		if (a[i]!='0'&&a[i]!='1') semn=val[a[i]];
		i++;
	}
	return semn;
}


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);
		val[x]=(val[x]*-1)+1;
 		i=1;
		printf("%d",eval());
	}

	
	return 0;
}