社区讨论
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 条回复,欢迎继续交流。
正在加载回复...