Cod sursa(job #794207)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 5 octombrie 2012 22:49:33
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb

#include <cstdio>

const int MAX_SIZE(1002);
const int MAX_MODIFY(101);

char expression [MAX_SIZE];
char modify [MAX_MODIFY];
bool values ['Z' + 1];

char *parser;

inline void read (void)
{
	std::freopen("bool.in","r",stdin);
	std::fgets(expression,MAX_SIZE,stdin);
	int x;
	std::scanf("%d\n%s",&x,modify);
	std::fclose(stdin);
}

bool priority1 (void);
bool priority2 (void);
bool priority3 (void);

inline void skip (void)
{
	while (*parser == ' ')
		++parser;
}

bool priority1 (void)
{
	char result(priority2());
	while (*parser == 'O' && parser[1] == 'R')
	{
		parser += 2;
		result = result || priority2();
	}
	return result;
}

bool priority2 (void)
{
	char result(priority3());
	while (*parser == 'A' && parser[1] == 'N')
	{
		parser += 3;
		result = result && priority3();
	}
	return result;
}

bool priority3 (void)
{
	bool result;
	skip();
	if (*parser == '(')
	{
		++parser;
		result = priority1();
		++parser;
	}
	else
	{
		int negations(0);
		while (*parser == 'N' && parser[1] == 'O')
		{
			++negations;
			parser += 3;
			skip();
		}
		if (*parser == 'T' && parser[1] == 'R')
			result = true;
		else if (*parser == 'F' && parser[1] == 'A')
			result = false;
		else
			result = values[*parser];
		if (negations % 2)
			result = !result;
	}
	return result;
}

inline void print (void)
{
	std::freopen("bool.out","w",stdout);
	for (char *iterator(modify) ; *iterator ; ++iterator)
	{
		values[*iterator] = !values[*iterator];
		parser = expression;
		if (priority1())
			std::putchar('1');
		else
			std::putchar('0');
	}
	std::putchar('\n');
	std::fclose(stdout);
}

int main (void)
{
	read();
	print();
	return 0;
}