Cod sursa(job #942215)

Utilizator cnnonNeagu Cristian cnnon Data 21 aprilie 2013 15:48:02
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.41 kb
#include <fstream>
#include <string.h>
using namespace std;

char x[2000];
char s[2000];
int k=0,n;

struct alfabet
{
	char l;
	bool b;
};
alfabet v[25];

void atr()
{
	int k2=1;
	for(char x='A';x<='Z';x++)
	{
		v[k2].l=x;
		v[k2].b=false;
		k2++;
	}
}

bool value(int i)
{
	for(int j=1;j<=25;j++)
	{
		if(v[j].l==s[i])
			return v[j].b;
	}
	return false;
}

bool litera(char a)
{
	if(a>='A' && a<='Z')
		return true;
	else 
		return false;
}

void inlocuire ()
{
	k=0;
	for(int i=0;i<n;i++)
	{	
		if(litera(s[i]) && !litera(s[i+1]) && (i==0 || !litera(s[i-1])))
				if(value(i))
				{
					x[k]='T';
					x[k+1]='R';
					x[k+2]='U';
					x[k+3]='E';
					k=k+4;
				}
				else
				{
					x[k]='F';
					x[k+1]='A';
					x[k+2]='L';
					x[k+3]='S';
					k=k+4;
				}
		else
		{
			x[k]=s[i];
			k++;
		}
	}
}
	
bool NOT ()
{
	bool changed = false;
	int j;
	for(int i=0;i<=k;i++)    // posibil pana la k-1
	{
		if(x[i]=='N' && x[i+1]=='O' && x[i+2]=='T' && x[i+3]==' ')
		{
			if (x[i+4]=='T')
			{
				x[i]='F';
				x[i+1]='A';
				x[i+2]='L';
				x[i+3]='S';
				j=i+8;
				while(j<=k) 
				{
					x[j-4]=x[j];
					j++;
				}
				k -= 4;
				changed = true;
			}
			if (x[i+4]=='F')
			{
				x[i]='T';
				x[i+1]='R';
				x[i+2]='U';
				x[i+3]='E';
				j=i+8;
			    while(j<=k) 
				{
					x[j-4]=x[j];
					j++;
				}
				k -= 4;
				changed = true;
			}
			
		}
	}
	return changed;
}

void change_false()
{
	int i , j ;
	for(i=0;i<n;i++)
		if(s[i]=='F' && s[i+1]=='A' && s[i+2]=='L' && s[i+3]=='S' && s[i+4]=='E')
		{
			j=i+5; 
			while(j<n)
			{
				s[j-1]=s[j];
				j++;
			}
			n--;
		}
}

bool and_or_not()
{
	bool changed = false;
	int i,j;
	for(i=0;i<=k;i++)
	{
		if(x[i]=='O' && x[i+1]=='R')
			if(x[i-2]!=')' && x[i-1]==' ' && x[i+2]==' ' && x[i+3]!='N' && x[i+3]!='(')
			{
		 		bool a=true , b=true;
				if(x[i-2]=='S') a=false;
				if(x[i+3]=='F') b=false;

				if(a || b)
				{
					x[i-5]='T';
					x[i-4]='R';
					x[i-3]='U';
					x[i-2]='E';
					j=i+7;
					while(j<=k)
					{
						x[j-8]=x[j];
						j++;
					}
					k -= 8;
				}
				else
				{
					x[i-5]='F';
					x[i-4]='A';
					x[i-3]='L';
					x[i-2]='S';
					j=i+7;
					while(j<=k)
					{
						x[j-8]=x[j];
						j++;
					}
					k -= 8;
				}
				changed = true;
			}
        if(x[i]=='A' && x[i+1]=='N' && x[i+2]=='D')
			if(x[i-2]!=')' && x[i-1]==' ' && x[i+3]==' ' && x[i+4]!='N' && x[i+4]!='(')
			{
				bool a=true , b=true;
				if(x[i-2]=='S') a=false;
				if(x[i+4]=='F') b=false;

				if(a && b)
				{
					x[i-5]='T';
					x[i-4]='R';
					x[i-3]='U';
					x[i-2]='E';
					j=i+8;
					while(j<=k)
					{
						x[j-9]=x[j];
						j++;
					}
					k -= 9;
				}
				else
				{
					x[i-5]='F';
					x[i-4]='A';
					x[i-3]='L';
					x[i-2]='S';
					j=i+8;
					while(j<=k)
					{
						x[j-9]=x[j];
						j++;
					}
					k -= 9;
				}
				changed = true;
			}
	}
	return changed;
}

bool remove()
{
	bool changed=false;
	int i, j;
	for(i=0;i<=k;i++)
	{
		if(x[i]=='(' && x[i+5]==')')
		{
			j=i+1;
			while(x[j]!=')')
			{
				x[j-1]=x[j];
				j++;
			}
			j++;
			while(j<=k)
			{
				x[j-2]=x[j];
				j++;
			}
			k -= 2;
			changed=true;
		}
	}
	return changed;
}

void mod_vect (char B)
{
	for(int i=1; i<=25; i++)
	{
		if(v[i].l==B)
		{
			v[i].b = !v[i].b;
			return;
		}
	}
}

void not_paranteza()
{
	for(int i=0;i<k;i++)
		if(s[i] == 'N' && s[i+1]=='O' && s[i+2]=='T' && s[i+3]=='(' )
		{
			for(int j=n;j>i+2;j--)
				s[j+1]=s[j];
			s[i+3]=' ';
			n++;
		}
}

int main()
{
	int l;  //
	char s1[101]; //
	int f;  
	ifstream F("bool.in");
	ofstream G("bool.out");
	F.get(s,2000);
	n=strlen(s);
	F>>l;  //
	F.get(); //
	F.get(s1,101);  //
	f=strlen(s1);
	atr();
	not_paranteza();
	change_false();
	//for(int i=0;i<n;i++)
	//	G<<s[i];
	//G<<endl;
	for( int v=0;v<l;v++)  //
	{
		
		mod_vect(s1[v]); //
		inlocuire();
		//for(int i=0;i<k;i++)
		//	G<<x[i];
		//G<<endl;
		bool stop = false;
		while(!stop)
		{	
			stop=true;
			while ( NOT() ) 
				stop=false ;
			while ( remove() ) 
				stop=false ;
			while ( and_or_not() ) 
				stop=false;
		
		}
		if(x[0] == 'F' ) G<<"0";
		else             G<<"1";
		//for(int i=0;i<k;i++)
		//	G<<x[i];
		//G<<endl<<endl;
	}
	G<<"\n";

	return 0;
}