Cod sursa(job #377604)

Utilizator SheepBOYFelix Liviu SheepBOY Data 25 decembrie 2009 13:53:39
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include<stdio.h>
char s[1001],chng[1001];
int i;
bool flg[1001];

bool RSolve(int pos,int sw)
{
	bool swch=(sw&1);
	bool rez=0;
	bool NvalOVR=0;
	short crnt_op=0;
	for(i=pos;s[i];++i)
	{
		if(s[i]=='(')
		{
			++i;
			if(NvalOVR)
				switch(crnt_op)
				{
					case 0:rez=!RSolve(i,sw);break;
					case 1:rez&=!RSolve(i,sw);break;
					case 2:rez|=!RSolve(i,sw);break; 
				}
			else
				switch(crnt_op)
				{
					case 0:rez=RSolve(i,sw);break;
					case 1:rez&=RSolve(i,sw);break;
					case 2:rez|=RSolve(i,sw);break; 
				}
				NvalOVR=0;
		}
		if(s[i]==')')
		{
			++i;
			return rez;
		}
		if(s[i]>='A'&&s[i]<='Z')
		{ 
			if(s[i]==chng[sw])
				flg[i]=!flg[i];
			
			if(s[i+1]&&s[i+1]>='A'&&s[i+1]<='Z')
			{
				if(s[i]=='N')
				{
					i+=2;
					NvalOVR=1;
					continue;
				}
				if(s[i]=='A')
				{
					i+=2;
					crnt_op=1;
					continue;
				}
				if(s[i]=='O')
				{
					++i;
					crnt_op=2;
					continue;
				}
				if(s[i]=='T')
				{
					i+=3;
					if(NvalOVR)
					switch(crnt_op)
					{
						case 0:rez=!(1>swch)?1:0;break;
						case 1:rez&=!(1>swch)?1:0;break;
						case 2:rez|=!(1>swch)?1:0;break;
					}
					else	
					switch(crnt_op)
					{
						case 0:rez=(1>swch)?1:0;break;
						case 1:rez&=(1>swch)?1:0;break;
						case 2:rez|=(1>swch)?1:0;break;
					}
				}
				if(s[i]=='F')
				{
					i+=3;
					if(NvalOVR)
					switch(crnt_op)
					{
						case 0:rez=!(0>swch)?1:0;break;
						case 1:rez&=!(0>swch)?1:0;break;
						case 2:rez|=!(0>swch)?1:0;break;
					}
					else	
					switch(crnt_op)
					{
						case 0:rez=(0<swch)?1:0;break;
						case 1:rez&=(0<swch)?1:0;break;
						case 2:rez|=(0<swch)?1:0;break;
					}
				}
			}
			else
			{
				if(NvalOVR)
					switch(crnt_op)
					{
						case 0:rez=!(1&flg[i]);break;
						case 1:rez&=!(1&flg[i]);break;
						case 2:rez|=!(1&flg[i]);break;
					}
				else
					switch(crnt_op)
					{
						case 0:rez=(1&flg[i]);break;
						case 1:rez&=(1&flg[i]);break;
						case 2:rez|=(1&flg[i]);break;
					}
				NvalOVR=0;
			}
		}
	}
return rez;
}
int main()
{
	int nch=0;
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	gets(s);
	scanf("%d\n",&nch);
	gets(chng);
	for(int j=0;j<nch;++j)
		printf("%d",RSolve(0,j));
}