Cod sursa(job #2303602)

Utilizator eilerGabriel-Ciprian Stanciu eiler Data 16 decembrie 2018 17:04:07
Problema Bool Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <fstream>
using namespace std;

struct Nod{
	char inf;
	Nod *st, *dr;
} *rad;

int k, n, pfp[1000], val[26];
char efp[1000];

Nod* arbore(int st, int dr){
	int Min, k, i;
	Nod *cr= new Nod;

	Min=pfp[dr]; k=dr;
	for (i=st; i<=dr; i++)
		if (pfp[i]<Min){
			Min=pfp[i];
			k=i;
		}

	cr->inf=efp[k];
	if (st==dr){
		cr->st=0;
		cr->dr=0;
	}
	else{
		if (cr->inf=='n'){
			cr->st=0;
			cr->dr=arbore(k+1, dr);
		}
		else{
			cr->st=arbore(st, k-1);
			cr->dr=arbore(k+1, dr);
		}
	}
	return cr;
}

bool dfs(Nod *cr){
	if (cr->inf>='A' && cr->inf<='Z')
		return val[cr->inf-'A'];
	if (cr->inf=='t')
		return 1;
	if (cr->inf=='f')
		return 0;
	if (cr->inf=='n'){
		if (cr->st==0)
			return !dfs(cr->dr);
		if (cr->dr==0)
			return !dfs(cr->st);
	}
	if (cr->inf=='o')
		return dfs(cr->st) || dfs(cr->dr);
	return dfs(cr->st) && dfs(cr->dr);
}

int main(){
	int i;
	char ch;

	ifstream fin ("bool.in");
	ch=fin.get(); i=0;
	while (ch!='\n'){
		if (ch=='(')
			i+=10;
		else if (ch==')')
			i-=10;
		else if (ch!=' '){
			if (ch=='A'){
				ch=fin.get();
				if (ch==' '){
					efp[n]='A';
					pfp[n]=1000+i;
				}
				else{
					fin.get(); ch=fin.get();
					efp[n]='a';
					pfp[n]=10+i;
				}
			}
			else if (ch=='O'){
				ch=fin.get();
				if (ch==' '){
					efp[n]='O';
					pfp[n]=1000+i;
				}
				else{
					ch=fin.get();
					efp[n]='o';
					pfp[n]=1+i;
				}
			}
			else if (ch=='N'){
				ch=fin.get();
				if (ch==' '){
					efp[n]='N';
					pfp[n]=1000+i;
				}
				else{
					fin.get(); ch=fin.get();
					efp[n]='n';
					pfp[n]=100+i;
				}
			}
			else if (ch=='T'){
				ch=fin.get();
				if (ch==' '){
					efp[n]='T';
					pfp[n]=1000+i;
				}
				else{
					fin.get(); fin.get(); ch=fin.get();
					efp[n]='1';
					pfp[n]=1000+i;
				}
			}
			else if (ch=='F'){
				ch=fin.get();
				if (ch==' '){
					efp[n]='F';
					pfp[n]=1000+i;
				}
				else{
					fin.get(); fin.get(); fin.get(); ch=fin.get();
					efp[n]='0';
					pfp[n]=1000+i;
				}
			}
			else{
				efp[n]=ch;
				pfp[n]=1000+i;
				ch=fin.get();
			}
			n++;
		}
		ch=fin.get();
	}
	rad=arbore(0, n-1);
	fin >> k; fin.get();
	ofstream fout ("bool.out");
	dfs(rad);
	for (i=0; i<k; i++){
		ch=fin.get();
		if (val[ch-'A']==0)
			val[ch-'A']=1;
		else
			val[ch-'A']=0;
		fout << dfs(rad);
	}
	fout.close();
	fin.close();


	return 0;
}