Cod sursa(job #282036)

Utilizator space.foldingAdrian Soucup space.folding Data 16 martie 2009 19:47:18
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>
#include <string.h>
#include <iostream.h>
char Expression[1001];
int Alphabet[30];
int L;


int EvaluateExpression(int &i);
int EvaluateOr(int &i);
int EvaluateAnd(int &i);
int EvaluateNot(int &i);

int StriCmp(int k, const char *string)
{	
	for(int l=strlen(string), t=0; t<l && k<L; t++, k++)
		if(string[t++]!=Expression[k++])
			return false;
	return true;	
}

int EvaluateExpression(int &i)
{
	int Result, r;
	Result=EvaluateOr(i);
	while(i<L && StriCmp(i, " OR "))
	{
		i+=4;
		r=EvaluateOr(i);
		Result=Result||r;
	}
	return Result;
}

int EvaluateOr(int &i)
{
	int Result, r;
	Result=EvaluateAnd(i);
	while(i<L && StriCmp(i, " AND "))
	{
		i+=5;
		r=EvaluateAnd(i);
		Result=Result&&r;
	}
	return Result;
}

int EvaluateAnd(int &i)
{
	int Result, r;
	if(StriCmp(i, "NOT "))
	{
		i+=4;
		r=EvaluateNot(i);
		Result=!r;
	}
	else
		Result=EvaluateNot(i);
	return Result;
}

int EvaluateNot(int &i)
{
	int Result;
	
	if(i<L)
	{
		if(Expression[i]=='(')
		{
			i++;
			Result=EvaluateExpression(i);
			i++;
		}	
		else
			if(Expression[i]>='A'&&Expression[i]<='Z' && Expression[i+1]!='A' && Expression[i+1]!='R')
				Result=Alphabet[Expression[i]-'A'], i++;
		else	
			if(StriCmp(i, "FALSE"))
				i+=5, Result=false;
		else			
			if(StriCmp(i, "TRUE"))
				i+=4, Result=true;

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