Cod sursa(job #339654)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 10 august 2009 19:18:24
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <stdio.h>
#include <string.h>
#define N 1<<10
#define OR v[poz]=='O' && v[poz+1]=='R'
#define AND v[poz]=='A' && v[poz+1]=='N' && v[poz+2]=='D'
#define NOT v[poz]=='N' && v[poz+1]=='O' && v[poz+2]=='T'
#define TRUE v[poz]=='T' && v[poz+1]=='R' && v[poz+2]=='U' && v[poz+3]=='E'
#define FALSE v[poz]=='F' && v[poz+1]=='A' && v[poz+2]=='L' && v[poz+3]=='S' && v[poz+4]=='E'
#define LITERA v[poz]>='A' && v[poz]<='Z'
#define LIT op[poz]>='A' && op[poz]<='Z'
char v[N],op[N];
int par[N],n,poz,r;
int rang2();
int rang3();
int expr();
int rang1()
{
	int rez=rang2(),rez2;
	while (op[poz]=='|')
	{
		poz++;
		rez2=rang2();
		if (rez==0 && rez2==0)
			rez=0;
		else
			rez=1;
	}
	return rez;
}
int rang2()
{
	int rez=rang3(),rez2;
	while (op[poz]=='&')
	{
		poz++;
		rez2=rang3();
		if (rez && rez2)
			rez=1;
		else
			rez=0;
	}
	return rez;
}
int rang3()
{
	int rez=0,ne=0;
	while (op[poz]=='!')
	{
		ne=!ne;
		poz++;
	}
	if (ne)
		rez=!expr();
	else
		rez=expr();
	return rez;
}
int expr()
{
	int rez=0;
	if (op[poz]=='1')
	{
		poz++;
		return 1;
	}
	if (op[poz]=='0')
	{
		poz++;
		return 0;
	}
	if (LIT)
	{
		if (par[(int)op[poz]-64]%2)
			rez=1;
		else
			rez=0;
		poz++;
	}
	if (op[poz]=='(')
	{
		poz++;
		rez=rang1();
		poz++;
	}
	return rez;
}
void remaking()
{
	poz=1;
	while (v[poz]!='\n')
	{
		if (AND)
		{
			op[++r]='&';
			poz+=3;
			continue;
		}
		if (OR)
		{
			op[++r]='|';
			poz+=2;
			continue;
		}
		if (TRUE)
		{
			op[++r]='1';
			poz+=4;
			continue;
		}
		if (FALSE)
		{
			op[++r]='0';
			poz+=5;
			continue;
		}
		if (NOT)
		{
			op[++r]='!';
			poz+=3;
			continue;
		}
		if (v[poz]==' ')
		{
			poz++;
			continue;
		}
		op[++r]=v[poz];
		poz++;
	}
}
int main()
{
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	int i;
	fgets(v+1,N,stdin);
	remaking();
	char x;
	scanf("%d\n",&n);
	for (i=1; i<=n; i++)
	{
		scanf("%c",&x);
		par[(int)x-64]++;
		poz=1;
		printf("%d",rang1());
	}
	return 0;
}