Cod sursa(job #2561989)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 29 februarie 2020 11:34:37
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <vector>
#include <string>
using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");

vector <int> v[30];
string a, b;
int n, i;

bool ok;

bool eval();

int main()
{
	getline(fin, a);
	fin >> n;
	b = "";
	for (int i = 0; i < a.size(); ++i)
	{
		string c = "";
		int poz_start = -1, cnt = 0;
		bool ok = false;
		while (i < a.size() && a[i] != ' ')
		{
			if (a[i] != '(' && a[i] != ')')
			{
				if (ok == 0) poz_start = i;
				ok = true;
				c += a[i];
			}
			else if (a[i] == '(') b += a[i];
			else cnt++;
			++i;
		}

		if (c == "AND")
			b += '&';
		else if (c == "OR")
			b += '|';
		else if (c == "NOT")
			b += '!';
		else if (c == "TRUE")
			b += '1';
		else b += '0';
		if (c.size() == 1)
			v[c[0] - 'A'].push_back(b.size() - 1);

		while (cnt)
		{
			b += ')';
			cnt--;
		}

	}
	char c;
	while(n--)
	{
		fin >> c;
		i = c - 'A';
		for (size_t j = 0; j < v[i].size(); ++j)
			b[v[i][j]] = (b[v[i][j]] == '0') + '0';
		i = 0;
		fout << eval();
	}
	return 0;
}

bool eval()
{
	bool ok;
	while (i < b.size())
	{
		if (isdigit(b[i]))
		{
			ok = b[i] - '0';
			++i;
		}
		else if (b[i] == '(')
		{
			++i;
			ok = eval();
		}
		else if (b[i] == '!')
		{
			++i;
			ok = !eval();
		}
		else if (b[i] == '&')
		{
			++i;
			ok &= eval();
		}
		else if (b[i] == '|')
		{
			++i;
			ok |= eval();
		}
		else break;
	}
	return ok;
}