Cod sursa(job #158685)

Utilizator andr33aradu ioana andr33a Data 13 martie 2008 19:40:20
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include<fstream.h>
#include<string.h>
ifstream f("bool.in");
ofstream g("bool.out");
char s[2050],*q,c,s1[]="NOT",s2[]="AND",s3[]="OR",s4[]="TRUE",s5[]="FALSE",st[2050];
int p[1000],n,z,a[30],exp[2050],x,y,i,j,m;
void modificare()
{
	q=strstr(s,s1);
	while(q)
	{
		strcpy(q,q+2);
		z=q-s;
		s[z]='!';
		q=strstr(q,s1);
	}
	q=strstr(s,s2);
	while(q)
	{
		strcpy(q,q+2);
		z=q-s;
		s[z]='&';
		q=strstr(q,s2);
	}
	q=strstr(s,s3);
	while(q)
	{
		strcpy(q,q+1);
		z=q-s;
		s[z]='|';
		q=strstr(q,s3);
	}
	q=strstr(s,s4);
	while(q)
	{
		strcpy(q,q+3);
		z=q-s;
		s[z]=',';
		q=strstr(q,s4);
	}
	q=strstr(s,s5);
	while(q)
	{
		strcpy(q,q+4);
		z=q-s;
		s[z]=':';
		q=strstr(q,s5);
	}
	q=strstr(s," ");
	while(q)
	{
		strcpy(q,q+1);
		q=strstr(q," ");
	}
}
void schimbare(char c)
{
	if(a[c-'A']==0)
		a[c-'A']=1;
	else
		a[c-'A']=0;
}
void operatie(int x,char c)
{
	if(c=='!')
		if(exp[x]==0)
			exp[x]=1;
		else
			exp[x]=0;
	else
		if(c=='&')
			if(exp[x-1]==1&&exp[x]==1)
				exp[x-1]=1;
			else
				exp[x-1]=0;
		else
			if(exp[x-1]==0&&exp[x]==0)
				exp[x-1]=0;
			else
				exp[x-1]=1;
}
int main()
{
	int k;
	f.getline(s,1045);
	f>>n;
	f.get();
	p['!']=3;
	p['&']=2;
	p['|']=1;
	modificare();
        m=strlen(s);
	for(k=1;k<=n;k++)
	{
		f>>c;
		schimbare(c);
		i=0;  x=0;y=0;
		while(i<m)
		{
			if((s[i]>='A'&&s[i]<='Z')||(s[i]==','||s[i]==':'))
			{
				if(s[i]>='A'&&s[i]<='Z')
					exp[++x]=a[s[i]-'A'];
				else
					if(s[i]==',')
						exp[++x]=1;
					else
						exp[++x]=0;
			}
			else
			{
				if(s[i]=='(')
					st[y++]='(';
				else
					if(s[i]==')')
					{
						j=y-1;
						while(st[j]!='(')
						{
							operatie(x,st[j]);
							if(st[j]!='!')
								x--;
							j--;y--;
						}
						y--;
					}
					else
					{
						j=y-1;
						while(st[j]!='('&&j>=0)
						{
							if(p[st[j]]>=p[s[i]])
							{
								operatie(x,st[j]);
								y--;
								if(st[j]!='!')
									x--;
							}
							j--;
						}
						st[y++]=s[i];
					}
			}
			i++;
		}
		operatie(x,st[0]);
		g<<exp[1];
	}
f.close();
g.close();
return 0;
}