Cod sursa(job #1698086)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 3 mai 2016 17:24:59
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.48 kb
#include <cstdio>
#include <stack>
using namespace std;

char buffer[10000];
char varEx[1000];

bool val[256];

bool next(int bufpos, char* temp, int len)
{
	for (int i = 0; i < len; i++)
	{
		if (buffer[bufpos + i] != temp[i])
			return false;
	}

	return true;
}

int buildVarEx()
{
	int len = 0, bufPos = 0;
	
	varEx[len++] = '(';

	while (buffer[bufPos] != 0)
	{
		if (next(bufPos, "(", 1))
		{
			varEx[len++] = '(';
			bufPos += 1;
		}
		else if (next(bufPos, ")", 1))
		{
			varEx[len++] = ')';
			bufPos++;
		}
		else if (next(bufPos, "AND", 3))
		{
			varEx[len++] = '&';
			bufPos += 3;
		}
		else if (next(bufPos, "OR", 2))
		{
			varEx[len++] = '|';
			bufPos += 2;
		}
		else if (next(bufPos, "NOT", 3))
		{
			varEx[len++] = '!';
			bufPos += 3;
		}
		else if (next(bufPos, "TRUE", 4))
		{
			varEx[len++] = '1';
			bufPos += 4;
		}
		else if (next(bufPos, "FALSE", 5))
		{
			varEx[len++] = '0';
			bufPos += 5;
		}
		else if (next(bufPos, " ", 1))
		{
			bufPos++;
		}
		else if ('A' <= buffer[bufPos] && buffer[bufPos] <= 'Z')
		{
			varEx[len++] = buffer[bufPos++];
		}
		else
			bufPos++;
	}
	varEx[len++] = ')';

	return len;
}

bool eval(int len)
{
	stack<char> operators;
	stack<bool> values;
	int pos = 0;

	operators.push('X');
	values.push('X');

	while (pos < len)
	{
		if (varEx[pos] == '!' || varEx[pos] == '(' || varEx[pos] == '&')
		{
			operators.push(varEx[pos]);
		}
		else if (varEx[pos] == '|')
		{
			while (operators.top() == '&')
			{
				operators.pop();

				bool val1 = values.top();
				values.pop();

				bool val2 = values.top();
				values.pop();

				values.push(val1 && val2);
			}

			while (operators.top() == '|')
			{
				operators.pop();

				bool val1 = values.top();
				values.pop();

				bool val2 = values.top();
				values.pop();

				values.push(val1 || val2);
			}

			operators.push('|');
		}
		else if ('A' <= varEx[pos] && varEx[pos] <= 'Z')
		{
			values.push(val[varEx[pos]]);

			while (operators.top() == '!')
			{
				bool v = values.top();
				values.pop();

				values.push(!v);

				operators.pop();
			}
		}
		else if ('0' <= varEx[pos] && varEx[pos] <= '1')
		{
			values.push(varEx[pos] == '1');

			while (operators.top() == '!')
			{
				bool v = values.top();
				values.pop();

				values.push(!v);

				operators.pop();
			}
		}
		else if (varEx[pos] == ')')
		{
			while (operators.top() != '(')
			{
				while (operators.top() == '&')
				{
					operators.pop();

					bool val1 = values.top();
					values.pop();

					bool val2 = values.top();
					values.pop();

					values.push(val1 && val2);
				}

				while (operators.top() == '|')
				{
					operators.pop();

					bool val1 = values.top();
					values.pop();

					bool val2 = values.top();
					values.pop();

					values.push(val1 || val2);
				}
			}

			operators.pop();

			while (operators.top() == '!')
			{
				operators.pop();

				bool v = values.top();
				values.pop();

				values.push(!v);
			}
		}

		pos++;
	}

	return values.top();
}

int main()
{
	freopen("bool.in", "r", stdin);
	freopen("bool.out", "w", stdout);

	fgets(buffer, 10000, stdin);

	int len = buildVarEx();

	int n, p = 0;
	scanf("%d", &n);

	while (n--)
	{
		char ct = 0;;
		
		while (ct < 'A' || ct > 'Z')
			scanf("%c", &ct);

		val[ct] = !val[ct];

		printf("%d", eval(len));
	}

	printf("\n");

	return 0;
}