Cod sursa(job #198119)

Utilizator AndreyPAndrei Poenaru AndreyP Data 8 iulie 2008 16:40:30
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include<stdio.h>
char s[1010],*p;
bool val[30];
int n;
bool ptsi();
bool ptsau();
bool ptnot();
bool verif(int x)
{
	if(*p==' ')
		p++;
	char *aux;
	aux=p;
	if(x==1)
	{
		if(*aux=='N')
		{
			aux++;
			if(*aux=='O')
			{
				aux++;
				if(*aux=='T')
				{
					p=aux+1;
					return true;
				}
			}
		}
		return false;
	}
	if(x==2)
	{
		if(*aux=='A')
		{
			aux++;
			if(*aux=='N')
			{
				aux++;
				if(*aux=='D')
				{
					p=aux+1;
					return true;
				}
			}
		}
		return false;
	}
	if(*aux=='O')
	{
		aux++;
		if(*aux=='R')
		{
			p=aux+1;
			return true;
		}
	}
	return false;
}
bool eval()
{
	if(*p==' ')
		p++;
	bool r=ptsau();
	while(verif(3))
		r|=ptsau();
	return r;
}
bool ptsau()
{
	bool r=ptsi();
	if(*p==' ')
		p++;
	while(verif(2))
		r&=ptsi();
	return r;
}
bool ptsi()
{
	bool r;
	if(*p==' ')
		p++;
	bool schimb=false;
	while(verif(1))
	{
		if(schimb)
			schimb=false;
		else
			schimb=true;
		if(*p==' ')
			p++;
	}
	/*if(*p=='(')
	{
		p++;
		r=eval();
		p++;
		if(schimb)
			return r==true ? false : true;
		return r;
	}*/
	r=ptnot();
	if(schimb)
		r=!r;
	return r;
}
int verifcun()
{
	char aux[10];
	char *ca;
	bool ok=true;
	aux[0]='T';
	aux[1]='R';
	aux[2]='U';
	aux[3]='E';
	int i;
	if(*p==' ')
		p++;
	for(i=0,ca=p; (i<4)&&(ok); i++,ca++)
		if(*ca!=aux[i])
			ok=false;
	if(ok)
	{
		p=ca;
		return 1;
	}
	aux[0]='F';
	aux[1]='A';
	aux[2]='L';
	aux[3]='S';
	aux[4]='E';
	for(i=0,ca=p; (i<5)&&(ok); i++,ca++)
		if(*ca!=aux[i])
			ok=false;
	if(ok)
	{
		p=ca;
		return 2;
	}
	return 0;
}
bool ptnot()
{
	bool r=false;
	int aux;
	if(*p==' ')
		p++;
	if(*p=='(')
	{
		p++;
		r=eval();
		p++;
	}
	else
	{
		aux=verifcun();
		if(aux)
			return aux==2 ? false : true;
		if(((*p)>='A')&&(*p<='Z'))
			r=val[*p-'A'];
		p++;
	}
	return r;
}
int main()
{
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	fgets(s,1010,stdin);
	scanf("%d\n",&n);
	char c;
	for(int i=0; i<n; i++)
	{
		scanf("%c",&c);
		p=s;
		if(val[c-'A'])
			val[c-'A']=false;
		else
			val[c-'A']=true;
		printf("%d",eval()==true ? 1 : 0);
	}
	printf("\n");
	return 0;
}