Cod sursa(job #398017)

Utilizator mottyMatei-Dan Epure motty Data 17 februarie 2010 20:43:33
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<stdio.h>
#include<string.h>
const int A=27,N=1005;
char c[N],v[N],*p=v;
int poz;
bool val[A];
bool AND(int i);
bool OR(int i);
bool NOT(int i);
bool FALSE(int i);
bool TRUE(int i);
int termen();
int factor();

void read()
{
	gets(c);
	int lim=strlen(c);
	for( int i=0 ; i<lim ; ++i )
		if( AND(i) )
		{
			v[poz++]='&';
			i+=2;
		}
		else if( OR(i) )
		{
			v[poz++]='|';
			i+=1;
		}
		else if( NOT(i) )
		{
			v[poz++]='!';
			i+=2;
		}
		else if( TRUE(i) )
		{
			v[poz++]='1';
			i+=3;
		}
		else if( FALSE(i) )
		{
			v[poz++]='0';
			i+=4;
		}
		else if( c[i]==' ');
		else
			v[poz++]=c[i];
}

int eval()
{
	int r=factor();
	if(*p=='|')
	{
		p++;
		r|=factor();
	}
	return r;
}

int factor()
{
	int r=termen();
	if(*p=='&')
	{
		p++;
		r&=termen();
	}
	return r;
}

int termen()
{
	int r=0;
	if(*p=='(')
	{
		p++;
		r=eval();
		p++;
	}
	if(*p=='!')
	{
		p++;
		r=!termen();
	}
	else if(*p=='1')
	{
		p++;
		r=1;
	}
	else if(*p=='0')
	{
		p++;
		r=0;
	}
	else if(*p>='A'&&*p<='Z')
	{
		r=val[*p-'A'];
		p++;
	}
	return r;
}

int main()
{
	int n;
	char ch;
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	read();
	scanf("%d\n",&n);
	while(n--)
	{
		scanf("%c",&ch);
		val[ch-'A']^=1;
		p=v;
		printf("%d",eval());
	}
	return 0;
}

bool AND(int i)
{
	if( c[i]=='A'&&c[i+1]=='N'&&c[i+2]=='D')
		return 1;
	return 0;
}

bool OR(int i)
{
	if( c[i]=='O' && c[i+1]=='R' )
		return 1;
	return 0;
}

bool NOT(int i)
{
	if( c[i]=='N'&&c[i+1]=='O'&&c[i+2]=='T')
		return 1;
	return 0;
}

bool FALSE(int i)
{
	if( c[i]=='F'&&c[i+1]=='A'&&c[i+2]=='L'&&c[i+3]=='S'&&c[i+4]=='E' )
		return 1;
	return 0;
}

bool TRUE(int i)
{
	if( c[i]=='T'&&c[i+1]=='R'&&c[i+2]=='U'&&c[i+3]=='E')
		return 1;
	return 0;
}