Cod sursa(job #777248)

Utilizator ephgstefana gal ephg Data 11 august 2012 17:25:09
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <cstdio>
#include <cstring>
#include<cctype>
#include <map>
using namespace std;
char sc[1005],sw[105], fin[1005],fp[1005],semn[1005];
int dim,dima,dimf,n,dimp,dims,dimr;
map<char,bool>mp;
bool rez[1005];
int ct_op(int i){
	if(i+4<=dim&&sc[i]=='F'&&sc[i+1]=='A'&&sc[i+2]=='L'&&sc[i+3]=='S'&&sc[i+4]=='E') return 1;
	if(i+3<=dim&&sc[i]=='T'&&sc[i+1]=='R'&&sc[i+2]=='U'&&sc[i+3]=='E')return 2;
	if(i+2<=dim&&sc[i]=='A'&&sc[i+1]=='N'&&sc[i+2]=='D')return 3;
	if(i+2<=dim&&sc[i]=='N'&&sc[i+1]=='O'&&sc[i+2]=='T')return 4;
	if(i+1<=dim&&sc[i]=='O'&&sc[i+1]=='R')return 5;
	return 0;
}
int pr(char cacat){
	if(cacat=='!')return 2;
	if(cacat=='&')return 1;
	if(cacat=='|')return 0;
	return 3;
}
void fpol(char out[1005],int &dimo){
	int i;
	for(i=1;i<=dimf;++i){
		if(isalpha(fin[i])||fin[i]=='0'||fin[i]=='1')out[++dimo]=fin[i];
		else if(fin[i]=='!'||fin[i]=='(')semn[++dims]=fin[i];
		else if(pr(fin[i])<2&&pr(fin[i])>=0){
			for(;dims&&semn[dims]!='('&&pr(semn[dims])>=pr(fin[i]);){
				out[++dimo]=semn[dims];
				--dims;
			}
			semn[++dims]=fin[i];
		}
		else if(fin[i]==')'){
			for(;dims&&semn[dims]!='(';){
				out[++dimo]=semn[dims];
				--dims;
			}
			--dims;
		}
	}
	for(;dims;--dims)out[++dimo]=semn[dims];
}
int ev(){
	int i;
	dimr=0;
	for(i=1;i<=dimp;++i){
		if(isalpha(fp[i])||fp[i]=='1'||fp[i]=='0')rez[++dimr]=mp[fp[i]];
		else if(fp[i]=='!')rez[dimr]=!rez[dimr];
		else if(fp[i]=='&')rez[dimr-1]=rez[dimr]&rez[dimr-1],--dimr;
		else if(fp[i]=='|')rez[dimr-1]=rez[dimr]|rez[dimr-1],--dimr;
	}
	//fprintf(stderr,"%d",dimr);
	return rez[dimr];
}
int main () {
	int i;
	char c=0;
	mp['0']=0;
	mp['1']=1;
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	for(;c!='\n';){
		scanf("%c",&c);
		sc[++dim]=c;
	}
	--dim;
	scanf("%d\n",&n);
	for(i=1;i<=n;++i)scanf("%c",&sw[i]);
	for(i=1;i<=dim;++i){
		if(ct_op(i)){
			//fprintf(stderr,"aici");
			if(ct_op(i)==1)fin[++dimf]='0',i+=4;
			else if(ct_op(i)==2)fin[++dimf]='1',i+=3;
			else if(ct_op(i)==3)fin[++dimf]='&',i+=2;
			else if(ct_op(i)==4)fin[++dimf]='!',i+=2;
			else if(ct_op(i)==5)fin[++dimf]='|',i+=1;
		
		}
		else{
			if((!(isalpha(sc[i-1])))&&(!(isalpha(sc[i+1])))&&isalpha(sc[i]))fin[++dimf]=sc[i];
			else if(sc[i]=='('||sc[i]==')')fin[++dimf]=sc[i];
		}
	}
	//for(i=1;i<=dimf;++i)fprintf(stderr,"%c",fin[i]);
	fpol(fp,dimp);
	//for(i=1;i<=dimp;++i)fprintf(stderr,"%c",fp[i]);
	for(i=1;i<=n;++i){
		mp[sw[i]]=!mp[sw[i]];
		printf("%d",ev());
	}
	return 0;
}