Cod sursa(job #87657)

Utilizator marius135Dumitran Adrian Marius marius135 Data 28 septembrie 2007 11:04:18
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<stdio.h>
#include<string.h>

long val[256];
long t[1024],inchis[1024];
char c[1010];

long calc(long a,long b)
{
	long valori[1024],poz =0;
	memset(valori,0,sizeof(valori));
	for(long i =a; i<=b;i++)
		{
		if(c[i]=='(')
			{
			
			long p=calc(i+1,inchis[i]-1);
			if(valori[poz]==0)
				valori[poz++] =p;
			else valori[poz++] =!p;
			i = inchis[i];
			continue;
			}
		if(c[i]>='a' && c[i]<='z')
			{
			if(valori[poz]==0)
				valori[poz++] = val[c[i]];
			else valori[poz++] = !val[c[i]];
			continue;
			}
		if(c[i]=='T')
			{
			if(valori[poz]==0)
				valori[poz++] = 1;
			else valori[poz++] = 0;
			i+=3;
			}
		if(c[i]=='F')
			{
			if(valori[poz]==0)
				valori[poz++] = 0;
			else valori[poz++] = 1;
			i+=4;
			}
		if(c[i]=='A')
			{
			valori[poz++] = 2;
			i+=2;
			}
		if(c[i]=='N')
			{
			if(valori[poz]==-1)
				valori[poz] =0;
			else valori[poz] = -1;
			i+=2;
			}
		if(c[i]=='O')
			{
			valori[poz++] = 3;
			i++;
			}
		}	
	valori[poz] = 1;
	long i,j;
	for(i=0;i<poz;i++)
	{
		if(valori[i]==2)
		{
			valori[i-1] = valori[i-1] &valori[i+1];
			for(j=i;j<poz-2;j++)
				valori[j] = valori[j+2];
			poz-=2;
		}
	}
	valori[poz] = 0;
	long rez = 0;
	for(i=0;i<poz;i+=2)
		rez|=valori[i];
	return rez;
}

int main()
{
	
	long i,n;
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	fgets(c,1010,stdin);
	long l = strlen(c),last = 0,j;
	for(i=0;i<l;i++)
		{
		if(c[i]=='(')
			{t[++last] = i;continue;	}
		if(c[i]==')')
			for(j=last;j>=0;j--)
				if(inchis[t[j]]==0)
				{
					inchis[t[j]] = i;break;
				}
		if(c[i]>='A' && c[i]<='Z' && !( c[i+1]<='Z' && c[i+1]>='A'))
			c[i]=c[i]-'A'+'a';
		}
		
	scanf("%ld",&n);
	for(i=1;i<=n;i++)
	{
		char a;
		scanf("\n%c",&a);a=a-'A'+'a';
		val[a] = !val[a];
		printf("%ld",calc(0,strlen(c)-1));
	}
	
}