Cod sursa(job #555933)

Utilizator theodora_maneaManea Theodora Maria theodora_manea Data 15 martie 2011 20:50:52
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char s[1001],ch;
int v[30];
int i,n,j;

int termen();
int factor();

int expresie() {
	int x;
	x=termen();
	while (s[i]=='|') {
			i++;
			x|=termen();
		}
	return x;
}

int termen() {
	int x,y;
	x=factor();
	while (s[i]=='&') {
		i++;
		x&=factor();
	}
	return x;
}

int factor() {
	int x;
	if (s[i]=='(') {
		i++;
		x=expresie();
		i++;
	}
	else {
	if (s[i]>='A' && s[i]<='Z') {
		x=v[s[i]-'A'];
		i++;
	}
	else 
		if (s[i]=='1' || s[i]=='0') {
			x=s[i]-48;
			i++;
		}
		else 
			if (s[i]=='!') {
				i++;
				x=!(expresie());
			}
	}
	return x;
}

void prelucrare() {
	int i,j;
	i=0; j=0;
	for (;i<=strlen(s);i++) {
		if (s[i]=='(') s[j++]='(';
		else if (s[i]==')') s[j++]=')';
		else if (strncmp(s+i,"TRUE",4)==0) {
			s[j++]='1';
			i+=3;
		}
		else if (strncmp(s+i,"FALSE",5)==0) {
			s[j++]='0';
			i+=4;
		}
		else if (strncmp(s+i,"NOT",3)==0) {
			s[j++]='!';
			i+=2;
		}
		else if (strncmp(s+i,"OR",2)==0) {
			s[j++]='|';
			i+=1;
		}
		else if (strncmp(s+i,"AND",3)==0) {
			s[j++]='&';
			i+=3;
		}
		else if (s[i]>='A' && s[i]<='Z') s[j++]=s[i];
	}
	s[j+1]=NULL;
}

int main () {
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	gets(s);
	prelucrare();
	scanf("%d\n",&n);
	for (j=1; j<=n; j++) {
		scanf("%c",&ch);
		v[ch-'A']=!v[ch-'A'];
		i=0;
		printf("%d",expresie());
	}
	printf("\n");
	return 0;
}