Cod sursa(job #213595)

Utilizator madmanjonesJones the one madmanjones Data 10 octombrie 2008 16:08:33
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <stdio.h>
#include <string.h>
#define N 1001
char s[N];
int v[N],p=1,f[27]={0};
int AND();
int NOT();
int factor();
int OR(){
	int r=AND();
	while(v[p]==2){
		++p;
		if(AND() || r)
			r=1;
		else r=0;
	}
	return r;
}
int AND(){
	int r=NOT();
	while(v[p]==1){
		++p;
		if(NOT() && r)
			r=1;
		else r=0;
	}
	return r;
}
int NOT(){
	int r=-1;
	while(v[p]==7){
		++p;
		if( factor() ) r=0;
		else r=1;
	}
	if(r==-1) r=factor();
	return r;
}
int factor(){
	int r=0;
	if(v[p]==5){
		p++;
		r=OR();
		p++;
	}
	else if(v[p]==7)
		r=NOT();
	else {
		if(v[p]==3) r=1;
		if(v[p]==4) r=0;
		if(v[p]>=(int)'A' && v[p]<=(int)'Z') r=f[v[p]-(int)'A'];
		p++;
	}
	return r;
}
int main(){
	int i,l,n;
	char x;
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	fgets(s,N,stdin);
	l=strlen(s);
	l--;
	for(i=0;i<l;i++){
		if(s[i]=='F'){
			if(s[i+1]=='A') v[++v[0]]=4,i+=4;
			else v[++v[0]]=(int)'F';
		}
		else if(s[i]=='T'){
			if(s[i+1]=='R') v[++v[0]]=3,i+=3;
			else v[++v[0]]=(int)'T';
		}
		else if(s[i]=='A'){
			if(s[i+1]=='N') v[++v[0]]=1,i+=2;
			else v[++v[0]]=(int)'A';
		}
		else if(s[i]=='N'){
			if(s[i+1]=='O') v[++v[0]]=7,i+=2;
			else v[++v[0]]=(int)'N';
		}
		else if(s[i]=='O'){
			if(s[i+1]=='R') v[++v[0]]=2,i+=1;
			else v[++v[0]]=(int)'O';
		}
		else if(s[i]=='(') v[++v[0]]=5;
		else if(s[i]==')') v[++v[0]]=6;
		else if(s[i]>='A' && s[i]<='Z') v[++v[0]]=(int)s[i];
	}
	scanf("%d\n",&n);
	for(i=1;i<=n;i++){
		scanf("%c",&x);
		if (f[(int)x-'A']) f[(int)x-'A']=0;
		else f[(int)x-'A']=1;
		p=1;
		printf("%d",OR());
	}
}