Cod sursa(job #2815693)

Utilizator Darius_CDarius Chitu Darius_C Data 10 decembrie 2021 09:16:59
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.91 kb
// Bool.cpp : This file contains the 'main' function. Program execution begins and ends there.
// infoarena

/**
* Algoritmul lui Dijkstra cu doua stive, forma poloneza postfixata
* a unei expresii logice
*/

#include <iostream>
#include <fstream>
#include <cctype>
#include <cstring>
#include <stack>
#define DIM 6006
#define MAXC 100
#pragma warning(disable: 4996)
std::ifstream fin("bool.in");
std::ofstream fout("bool.out");
using namespace std;

int N;
char s[DIM];
bool adevar[MAXC];
stack<char> op;
stack<bool> nr;

bool eval(bool x, bool y, char semn)
{
	if (semn == '&') return x & y;
	if (semn == '|') return x | y;
}

bool prioritate(char s1, char s2)
{
	if (s1 == '(')
		return true;
	if (s1 == '|' && s2 == '&')
		return true;
	return false;
}

void dijkstra()
{
	char sep[] = " ";
	char* p = strtok(s, sep);
	while (p != NULL)
	{
		// Paranteze
		if (!strcmp(p, "("))
			op.push('(');
		else if (!strcmp(p, ")"))
		{
			while (op.top() != '(')
			{
				bool v2 = nr.top();
				nr.pop();
				bool v1 = nr.top();
				nr.pop();
				char semn = op.top();
				op.pop();
				nr.push(eval(v1, v2, semn));
			}
			op.pop();
		}
		// Operatori
		else if (!strcmp(p, "AND") || !strcmp(p, "OR"))
		{
			char Operator;
			if (!strcmp(p, "AND"))
				Operator = '&';
			else
				Operator = '|';

			if (op.empty() || prioritate(op.top(), Operator))
				op.push(Operator);
			else
			{
				do
				{
					bool v2 = nr.top();
					nr.pop();
					bool v1 = nr.top();
					nr.pop();
					char semn = op.top();
					op.pop();
					nr.push(eval(v1, v2, semn));
				} while (!op.empty() && !prioritate(op.top(), Operator));
			}
		}
		// Operanzi
		else
		{
			// Constante
			if (!strcmp(p, "TRUE") || !strcmp(p, "FALSE"))
			{
				if (!strcmp(p, "TRUE"))
					nr.push(true);
				else
					nr.push(false);
			}
			// Variabile
			else
			{
				// Verificam daca exista negatie
				if (!strcmp(p, "NOT"))
				{
					p = strtok(NULL, sep);
					char var = p[0];
					nr.push(adevar[var - 'A'] ^ 1);
				}
				else
				{
					char var = p[0];
					nr.push(adevar[var - 'A']);
				}
			}
		}
		p = strtok(NULL, sep);
	}
	while (!op.empty())
	{
		bool v2 = nr.top();
		nr.pop();
		bool v1 = nr.top();
		nr.pop();
		char semn = op.top();
		op.pop();
		nr.push(eval(v1, v2, semn));
	}
	fout << nr.top();
}

static inline void Read()
{
	char h[DIM];
	int k = 0;
	fin.getline(h, DIM);
	for (int i = 0; h[i] != '\0'; i++)
		if (h[i] == '(')
			s[k] = h[i], s[k + 1] = ' ', k += 2;
		else if (h[i] == ')')
			s[k] = ' ', s[k + 1] = h[i], k += 2;
		else
			s[k++] = h[i];
}

static inline void Solve()
{
	fin >> N;
	for (int i = 0; i < MAXC; i++)
		adevar[i] = false;
	for (char var; N; N--)
	{
		fin >> var;
		adevar[var - 'A'] = adevar[var - 'A'] ^ 1; // x^1 == !x
		dijkstra();
	}
}

int main()
{
	Read();
	Solve();
	return 0;
}