Cod sursa(job #598129)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 24 iunie 2011 17:03:10
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
# include <fstream>
# include <cstring>
using namespace std;

ifstream f ("bool.in");
ofstream g ("bool.out");

char a[1020];
char b[1020];
int n, i, in, l, ll, v[300];
char c;

int si ();
int sau ();
int nu ();

int si ()
{
	int v1 = sau ();
	while (a[in] == '&')
	{
		++in;
		int v2 = sau ();
		return v1 & v2;
	}
	return v1;
}

int sau ()
{
	int v1 = nu ();
	while (a[in] == '|')
	{
		++in;
		int v2 = nu ();
		return v1 | v2;
	}
	return v1;
}

int nu ()
{
	int v1 = 0;
	if (a[in] == '!')
	{
		v1 = 1;
	}
	else
	if (a[in] == '(')
	{
		++in;
		v1 = v1 ^ si ();
		++in;
	}
	else
	{
		v1 ^= v[a[in] - 0];
		++in;
	}
	return v1;
}
int main ()
{
	f.get (a, 1010);
	l = strlen (a);
	f >> n;
	
	for (i = 0; i < l; )
	{
		if (a[i] == 'A' && a[i + 1] == 'N' && a[i + 2] == 'D')
		{
			b[ll++] = '&';
			i += 3;
		}
		else
		if (a[i] == 'O' && a[i + 1] == 'R')
		{
			b[ll++] = '|';
			i += 2;
		}
		else
		if (a[i] == 'N' && a[i + 1] == 'O' && a[i + 2] == 'T')
		{
			b[ll++] = '!';
			i += 3;
		}
		else
		if (a[i] == 'T' && a[i + 1] == 'R' && a[i + 2] == 'U' && a[i + 3] == 'E')
		{
			b[ll++] = '1';
			i += 4;
		}
		else
		if (a[i] == 'F' && a[i + 1] == 'A' && a[i + 2] == 'L' && a[i + 3] == 'S' && a[i + 4] == 'E')
		{
			b[ll++] = '0';
			i += 5;
		}
		if (a[i] >= 'A' && a[i] <= 'Z')
		{
			b[ll++] = a[i];
			++i;
		}
		else
		if (a[i] == '(' || a[i] == ')')
		{
			b[ll++] = a[i];
			++i;
		}
		else ++i;
	}
	
	memcpy (a, b, sizeof (b));
	for (i = 1; i <= n; ++i)
	{
		f >> c;
		in = 0;
		v[c - 0] = !v[c - 0];
		g << si ();
	}
}