Cod sursa(job #94792)

Utilizator piroslPiros Lucian pirosl Data 25 octombrie 2007 18:23:33
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.72 kb
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

bool chars[30];
char operatori[1000];
int poperatori;
char poloneza[1000];
int ppoloneza;

void transform(string& expresie)
{
	poperatori = 0;
	ppoloneza = 0;

	while(expresie.length() > 0)
	{
		while(expresie.at(0) == ' ') 
		{
			if(expresie.length() > 1)
				expresie = expresie.substr(1);
			else
				expresie = "";
		}
		if(expresie.length() == 0)
			break;

		if(expresie.at(0) == '(')
		{
			operatori[poperatori++] = '(';
			expresie = expresie.substr(1);
			continue;
		}
		if(expresie.at(0) == ')')
		{
			while(poperatori >= 0)
			{
				if(operatori[poperatori--] == '(')
					break;
				poloneza[ppoloneza] = operatori[poperatori+1];
			}
			if(expresie.length() > 1)
				expresie = expresie.substr(1);
			else
				expresie = "";
			continue;
		}

		size_t poz1 = expresie.find_first_of(" ");
		size_t poz2 = expresie.find_first_of(")");
		string s1;
		if(poz1 > 0 && poz2 > 0)
		{
			size_t min = poz1;
			if(poz2<poz1)
				min = poz2;
			s1 = expresie.substr(0, min);
			if(min < expresie.length())
				expresie = expresie.substr(min);
			else
				expresie = "";
		}
		else
		{
			if(poz1 > 0)
			{
				s1 = expresie.substr(0, poz1);
				if(poz1 < expresie.length())
					expresie = expresie.substr(poz1);
				else
					expresie = "";
			}
			else
			{
				if(poz2 > 0)
				{
					s1 = expresie.substr(0, poz2);
					if(poz2 < expresie.length())
						expresie = expresie.substr(poz2);
					else
						expresie = "";
				}
				else
				{
					s1 = expresie;
					expresie = "";
				}
			}
		}
		if(s1.length() == 1 && s1.at(0) >= 'A' && s1.at(0) <='Z')
			poloneza[ppoloneza++] = s1.at(0);
		if(s1.compare("TRUE") == 0)
			poloneza[ppoloneza++] = '1';
		if(s1.compare("FALSE") == 0)
			poloneza[ppoloneza++] = '0';
		if(s1.compare("NOT") == 0)
		{
			operatori[poperatori++] = '!';
		}
		if(s1.compare("AND") == 0)
		{
			while(poperatori > 0)
			{
				char c = operatori[poperatori];
				if(c == '!' ) 
				{
					poperatori--;;
					poloneza[ppoloneza++] = c;
					continue;
				}
				break;
			}
			operatori[poperatori++] = '*'; //and
		}
		if(s1.compare("OR") == 0)
		{
			while(poperatori > 0)
			{
				char c = operatori[poperatori];
				if(c == '+' || c == '(') 
				{
					break;
				}
				poperatori--;
				poloneza[ppoloneza++] = c;
				break;
			}
			operatori[poperatori++] = '+'; //or
		}		
	}
	while(poperatori>0)
	{
		poloneza[ppoloneza++] = operatori[poperatori--];
	}
}

int main(void)
{
	ifstream in;
	ofstream out;
	in.open("bool.in");
	out.open("bool.out");
	string expresie;
	
	char read[1001];
	in.getline(read, 1001);
	expresie.assign(read);

	transform(expresie);

	for(int i=0;i<30;++i)
		chars[i] = false;
	
	int n;
	in >> n;
	for(int i=0;i<n;++i) 
	{
		char ch;
		in >> ch;
		bool value[1001];
		int pvalue = 0;
		chars[ch-'A'] = !chars[ch-'A'];
		for(int k=0;k<ppoloneza;++k)
		{
			if(poloneza[k]>= 'A' && poloneza[k] <='Z')
				value[pvalue++] = chars[poloneza[k] - 'A'];
			if(poloneza[k] == '1')
				value[pvalue++] = true;
			if(poloneza[k] == '0')
				value[pvalue++] = false;
			if(poloneza[k] == '!')
			{
				value[pvalue-1] = !value[pvalue-1];			
			}
			if(poloneza[k] == '*')
			{
				bool b = value[pvalue-1];
				pvalue--;
				bool a = value[pvalue-1];
				pvalue--;
				value[pvalue++] = a & b;
			}
			if(poloneza[k] == '+')
			{
				bool b = value[pvalue-1];
				pvalue--;
				bool a = value[pvalue-1];
				pvalue--;
				value[pvalue++] = a | b;
			}
		}
		if(value[0])
			out << "1";
		else
			out << "0";
	}

	out << "\n";
	in.close();
	out.close();
	return 0;
}