Cod sursa(job #907987)

Utilizator Kira96Denis Mita Kira96 Data 8 martie 2013 16:37:22
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<fstream>
#define DIM 1010
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
int t,i,n,v[DIM];
char s[DIM],S[DIM],*p=S,c;
bool exp(); bool orr(); bool an(); void cod();

int main ()
{
	f.get(s,1001);
	t=-1;
	cod();
	v['1']=1;
	f>>n;
	for(i=1;i<=n;++i)
	{
		*p=S[0];
		f>>c;
		v[c]=!v[c];
		g<<exp();
	}
}
bool exp()
{
	bool r=orr();
	while(*p=='|')
	{
		++p;
		r=r|orr();
		
	}
	return r;
}
bool orr()
{
	bool r=an();
	while(*p=='&')
	{
		++p;
		r=r&an();
		
	}
	return r;
}
bool an()
{
	bool r=0;
	bool no=0;
	while(*p=='!'){
		no=!no; ++p; }
	if(*p=='(')
	{
		++p;
		if(no)
		r=!exp();
		else
			r=exp();
		++p;
	}
	else
	{
		if(no)
			r=!v[*p];
		else
			r=v[*p];
		p++;
	}
	return r;
}




void cod()
{
	for(i=0;s[i];++i)
	{
		if(s[i]==' ')
			continue;
		if(s[i]=='(')
			S[++t]=s[i];
		else
			if((s[i]<='Z'&&s[i]>='A')&&(s[i+1]>'Z'||s[i+1]<'A'))
				S[++t]=s[i];
			else
			if(s[i]==')')
				S[++t]=s[i];
			else
			{
				if(s[i]=='T')
				{
					S[++t]='1';
					i+=3;
				}
				if(s[i]=='F')
				{
					S[++t]='0';
					i+=4;
				}
				if(s[i]=='N')
				{
					S[++t]='!';
					i+=2;
				}
				if(s[i]=='O')
				{
					S[++t]='|';
					i++;
				}
				if(s[i]=='A')
				{
					S[++t]='&';
					i+=2;
				}
			}
	}
}