Cod sursa(job #635222)

Utilizator TodeaDariustodea darius TodeaDarius Data 18 noiembrie 2011 20:08:58
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.77 kb
#include<fstream>
#include<string.h>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
char v[1005],mod[105],expr[1000][5];
int n,i,s[1005],nr[1000],b,knr,kexpr,a,rez,k,k1;
int rezolvare(int poz)
{
	int j=0;knr=0;kexpr=0;k=0;k1=0;
	if((s[mod[poz]-'A'])==1) s[mod[poz]-'A']=0;
	else
	{s[mod[poz]-'A']=1;}
	while(j<b)
	{
		if(v[j]>='A' && v[j]<='Z' && (v[j+1]==' ' || j==b-1 || v[j+1]==')'))
		{
			nr[++knr]=s[v[j]-'A'];j++;
			while(kexpr>=1 && (strcmp(expr[kexpr],"NOT")==0 || strcmp(expr[kexpr],"AND")==0))
			{
				if(strcmp(expr[kexpr],"NOT")==0)
				{
					nr[knr]=!nr[knr];
					kexpr--;
				}
				if(strcmp(expr[kexpr],"AND")==0)
				{
					nr[knr-1]=nr[knr] && nr[knr-1];
					knr--;kexpr--;
				}
			}
		}
		else
		{
			if(v[j]>='A' && v[j]<='Z' && v[j+1]!=' ')
			{
				if(v[j]=='A' || v[j]=='N')
				{
					if(v[j]=='A') strcpy(expr[++kexpr],"AND");
					if(v[j]=='N') strcpy(expr[++kexpr],"NOT");
					j=j+3;
				}
				else
				{
					if(v[j]=='T') 
					{
						nr[++knr]=1;
						while(kexpr>=1 && (strcmp(expr[kexpr],"NOT")==0 || strcmp(expr[kexpr],"AND")==0))
						{
							if(strcmp(expr[kexpr],"NOT")==0)
							{
								nr[knr]=!nr[knr];
								kexpr--;
							}
							if(strcmp(expr[kexpr],"AND")==0)
							{
								nr[knr-1]=nr[knr] && nr[knr-1];
								knr--;kexpr--;
							}
						}
						j=j+4;
					}
					else
					{
						if(v[j]=='F') 
						{
							nr[++knr]=0;
							while(kexpr>=1 && (strcmp(expr[kexpr],"NOT")==0 || strcmp(expr[kexpr],"AND")==0))
							{
								if(strcmp(expr[kexpr],"NOT")==0)
								{
									nr[knr]=!nr[knr];
									kexpr--;
								}
								if(strcmp(expr[kexpr],"AND")==0)
								{
									nr[knr-1]=nr[knr] && nr[knr-1];
									knr--;kexpr--;
								}
							}
							j=j+5;
						}
						else
						{
							if(v[j]=='O') {strcpy(expr[++kexpr],"OR");j=j+2;}
						}
					}
				}
			}
			else
			{
				if(v[j]=='(')
				{strcpy(expr[++kexpr],"(");j++;}
				else
				{
					if(v[j]==')')
					{
						while(strcmp(expr[kexpr],"(")!=0)
						if(strcmp(expr[kexpr],"OR")==0)
						{
							nr[knr-1]=nr[knr] || nr[knr-1];
							knr--;kexpr--;
						}
						kexpr--;j++;
					}
					else{j++;}
				}
			}
		}
	}
	while(kexpr>=1)
	{
		if(strcmp(expr[kexpr],"NOT")==0)
			{
				nr[knr]=!nr[knr];
				kexpr--;
			}
		if(strcmp(expr[kexpr],"AND")==0)
		{
			nr[knr-1]=nr[knr] && nr[knr-1];
			knr--;kexpr--;
		}
		if(strcmp(expr[kexpr],"OR")==0)
		{
			nr[knr-1]=nr[knr] || nr[knr-1];
			knr--;kexpr--;
		}
	}
	return nr[knr];
}
int main()
{
	f.getline(v,1005,'\n');
	f>>n;f.get();f.getline(mod,105,'\n');
	a=strlen(mod);b=strlen(v);
	for(i=0;i<a;i++)
	{
		rez=rezolvare(i);
		g<<rez;
	}
	return 0;
}