Cod sursa(job #923365)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 23 martie 2013 13:46:41
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <fstream>
#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <string.h>
#include <iomanip>
using namespace std;


const string file = "bool";

const string infile = file + ".in";
const string outfile = file + ".out";


int N;

bool Values[30];

string expr;
string trans;

string change;

int index = 0;
int len;

void citire()
{
	ifstream fin(infile.c_str());
	
	getline(fin, expr);
	fin >> N;
	fin >> change;

	fin.close();
}

bool readE();

bool readF()
{
	bool c = 0;
	bool r;
	while(index < len && trans[index] == '!')
	{
		index++;
		c ^= 1;
	}
	
	if(trans[index] == '(')
	{
		index++;
		r = readE();
		index++;
	}
	else if(trans[index] == 1 || trans[index] == 0)
	{
		if(trans[index] == 1)
		{
			r = true;
		}
		else 
		{
			r = false;
		}
	}
	else
	{
		r = Values[trans[index] - 'A'];
		index++;
	}

	if(c)
	{
		return !r;
	}
	return r;
}


bool readT()
{
	bool f = readF();

	while(index < len && trans[index] == '&')
	{
		index++;
		f &= readF();
	}
	return f;
}

bool readE()
{
	bool t = readT();
	while(index < len && trans[index] == '|')
	{
		index++;
		t |= readT();
	}
	return t;
}


void solve()
{
	trans.reserve(expr.size());
	unsigned int i = 0;
	while( i < expr.size() )
	{
		if( expr[i] ==' ' )
		{
			i ++;
		}
		else if( expr[i] =='T' && expr[i + 1] == 'R')
		{
			trans.push_back('1');
			i += 4;
		}
		else if(expr[i] =='F' && expr[i + 1] == 'A')
		{
			trans.push_back('0');
			i += 5;
		}
		else if(expr[i] =='A' && expr[i + 1] == 'N')
		{
			trans.push_back('&');
			i += 3;
		}
		else if(expr[i] =='O' && expr[i + 1] == 'R')
		{
			trans.push_back('|');
			i += 2;
		}
		else if(expr[i] =='N' && expr[i + 1] == 'O')
		{
			trans.push_back('!');
			i += 3;
		}
		else
		{
			trans.push_back(expr[i]);
			i ++;
		}
	}
	len = trans.size();
}


void afisare()
{
	
	ofstream fout(outfile.c_str());

	for(int i = 0; i < N; i++)
	{
		int c = change[i] - 'A';
		Values[c] ^= 1;
		index = 0;
		fout << readE() ;
	}

	fout.close();
}

int main()
{

	citire();
	solve();
	afisare();
}