Cod sursa(job #281959)

Utilizator space.foldingAdrian Soucup space.folding Data 16 martie 2009 15:03:07
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
#include <string.h>
#include <iostream.h>
char e[1001];
bool alf[30]={false};
int L, N, i;


bool EvaluareExpresie();
bool EvaluareOr();
bool EvaluareAnd();

bool extra(int k, const char *string)
{
	char temp[100];
	int t=0, l=strlen(string);
	while(k<L && e[k]!=' ' &&t<l)
		temp[t++]=e[k++];
	temp[t]=0;

	if(!strcmp(temp, string))
	  return true;
	else
	  return false;
}

bool EvaluareExpresie()
{
	bool rez;
	rez=EvaluareOr();
	if(e[i]==' ') 
		i++;
	while(i<L && extra(i, "OR"))
	{
		i+=3;
		rez = rez || EvaluareOr();
	}
	return rez;
}

bool EvaluareOr()
{
	bool rez;
	rez=EvaluareAnd();
	if(e[i]==' ') 
		i++;
	while(i<L && extra(i, "AND"))
	{
		i+=4;
		rez = rez && EvaluareAnd();
	}
	return rez;
}

bool EvaluareAnd()
{
	bool rez;
	if(e[i]=='(')
	{
		i++;
		rez=EvaluareExpresie();
		i++;
		if(e[i]==' ')
			i++;
	}
	else
		if(extra(i, "NOT"))
		{
			i+=4;
			rez=!EvaluareExpresie();
		}
		else
			if(e[i]>='A'&&e[i]<='Z' && !(e[i+1]>='A' && e[i+1]<='Z'))
			{
				rez=alf[e[i]-'A'];
				++i;
				if(e[i]==' ')
				   ++i;
			}
			else
				if(extra(i, "FALSE"))
				{
					i+=5;
					if(e[i]==' ')
					  i++;
					return false;
				}
				else if(extra(i, "TRUE"))
				{
					i+=4;
					if(e[i]==' ')
					  i++;
					return true;
				}
	return rez;
}



int main ()
{
	char c;
	freopen("bool.in", "r", stdin);
	freopen("bool.out", "w", stdout);
	cin.getline(e, 1001);
	cin>>N;
	
	L=strlen(e);
	for(int j=0; j<N; j++)
	{
		cin>>c;
		alf[c-'A']=!alf[c-'A'];
		i=0;
		printf("%d", EvaluareExpresie());
	}
	if(N==0)
		printf("%d", EvaluareExpresie());
	return 0;
}