20分求调
查看原帖
20分求调
1054383
c_legg楼主2024/7/24 13:37
#include<bits/stdc++.h>
using namespace std;

int nor, nand;

class Tree {
public:
	virtual bool eval() const=0;
	Tree() { };
};

class branch:public Tree {
private:
	char oper;
	Tree *left, *right;
public:
	bool eval() const {
		bool lv;
		lv=left->eval();
		if(oper=='|') {
			if(lv==1) {
				nor++;
				return 1;
			}
			return lv|(right->eval());
		}else if(oper=='&') {
			if(lv==0) {
				nand++;
				return 0;
			}
			return lv&(right->eval());
		}
	}
	branch(char o, Tree *l, Tree *r) {
		oper=o, left=l, right=r;
	}
	branch() { }
};

class leaf:public Tree {
private:
	bool val;
public:
	bool eval() const {
		return val;
	}
	leaf(bool v) {val=v; }
	leaf() { }
};
leaf ret1[10000];
branch ret2[10000];
int c1=0, c2=0;
char lvmap[2]={'|', '&'};
Tree* parseIter(string s, int lv) {
	if(s.length()<=2) {
		cout<<s<<endl;
		ret1[c1]=leaf(s[0]-'0');
		return &ret1[c1++];
	}
	if(lv<=1) {
		int st=0;
		string left, right;
		left.clear(), right.clear();
		int i=0;
		while((s[i]!=lvmap[lv] || st>0) && i<(int)s.length()) {
			if(s[i]=='(')st++;
			if(s[i]==')')st--;
			left.push_back(s[i++]);
		};
		i++;
		while(i<=(int)s.length()) {
			right.push_back(s[i++]);
		}
		if(right.length()>1) {
			cout<<lvmap[lv]<<" "<<left<<" "<<right<<endl;
			int c=c2++;
			ret2[c]=branch(lvmap[lv], parseIter(left, lv+1), parseIter(right, lv+1));
			return &ret2[c];
		}else {
			return parseIter(left, lv+1);
		}
	}else if(s[0]=='(') {
		string val;
		val.clear();
		int st=0, i=1;
		while((s[i]!=')' || st>0) && i<(int)s.length()) {
			if(s[i]=='(')st++;
			if(s[i]==')')st--;
			val.push_back(s[i++]);
		};
		cout<<val<<endl;
		return parseIter(val, 0);
	}
	cout<<s<<endl;
}

int main() {
	string s;
	cin>>s;
	Tree *root=parseIter(s, 0);
	cout<<root->eval()<<endl<<nand<<" "<<nor;
	return 0;
}
2024/7/24 13:37
加载中...