社区讨论

100Unaccepted 求调

P8815[CSP-J 2022] 逻辑表达式参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo1qeppx
此快照首次捕获于
2023/10/23 01:17
2 年前
此快照最后确认于
2023/11/03 01:56
2 年前
查看原帖
不知道为什么Substack3错了7个点,而且都是短路数量错的
CPP
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
string s;
struct node
{
	int type;
	char op;
	int num;
	int level;
};
node a[1000005],b[1000005];
int cnt;
struct sort_node
{
	int id;
	int level;
};
sort_node c[1000005];
bool cmp(sort_node a,sort_node b)
{
	return a.level!=b.level?a.level>b.level:a.id<b.id;
}
int last[1000005];//并查集记录信息
int f(int id)
{
	if(last[id]==id)
		return id;
	return last[id]=f(last[id]);
}
struct tree_node
{
	int ls,rs;
	int type;
	char op;
	int num;
};
tree_node tree[1000005];
void print(int id,int tab)
{
	for(int i=1;i<=tab;i++)
		cout<<"    ";
	cout<<id<<"号节点 类型:"<<tree[id].type<<" ";
	if(tree[id].type==1)
		cout<<"数值:"<<tree[id].num;
	else
		cout<<"符号:"<<tree[id].op;
	cout<<" 左子节点:"<<tree[id].ls<<" 右子节点:"<<tree[id].rs<<"\n";
	if(tree[id].ls!=0)
		print(tree[id].ls,tab+1);
	if(tree[id].rs!=0)
		print(tree[id].rs,tab+1); 
}
//与短路,或短路 
int ans1,ans2;
int eval(int id)
{
	if(tree[id].type==1)
		return tree[id].num;
	int left=eval(tree[id].ls);
	if(left==0&&tree[id].op=='&')
	{
		ans1++;
		return 0;
	}
	else if(left==1&&tree[id].op=='|')
	{
		ans2++;
		return 1;
	}
	else
	{
		int right=eval(tree[id].rs);
		if(tree[id].op=='|')
			return left|right;
		else
			return left&right;
	}
}
int main()
{
	cin>>s;
	int level=0;
	for(int i=0;i<s.length();i++)
	{
		if(s[i]=='0'||s[i]=='1')
		{
			a[i+1].type=1;
			a[i+1].num=s[i]-'0';
		}
		else if(s[i]=='&'||s[i]=='|')
		{
			a[i+1].level=level*100000;
			if(s[i]=='&')
				a[i+1].level+=10000;
			a[i+1].type=2;
			a[i+1].op=s[i];
		}
		else if(s[i]=='('||s[i]==')')
		{
			if(s[i]=='(')
				level++;
			else
				level--;
			a[i+1].type=3;
			a[i+1].op=s[i];
		}
	}
	for(int i=1;i<=s.length();i++)
	{
		if(a[i].type!=3)
		{
			cnt++;
			b[cnt]=a[i];
		}
	}
	//建树 
	//确定运算顺序 
	int cur=0;
	for(int i=1;i<=cnt;i++)
		if(b[i].type==2)
		{
			cur++;
			c[cur].id=i;
			c[cur].level=b[i].level;
		}
	sort(c+1,c+cur+1,cmp);
	//初始化并查集结构
	for(int i=1;i<=cnt;i++)
		last[i]=i;
	for(int i=1;i<=cnt;i++)
	{
		tree[i].type=b[i].type;
		tree[i].op=b[i].op;
		tree[i].num=b[i].num;
	}
	//对每个符号建树 
	int root=-1;
	for(int i=1;i<=cur;i++)
	{
		int u=c[i].id;
		root=u;
		int left=f(u-1);
		int right=f(u+1);
		tree[u].ls=left;
		tree[u].rs=right;
		last[left]=last[right]=u;
	}
	//print(root,0);
	cout<<eval(root)<<"\n"<<ans1<<" "<<ans2;
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...