P8815 [CSP-J 2022] 逻辑表达式
Problem
考察算法:后缀表达式计算、建表达式树、\(DFS\)。
题目简述
给你一个中缀表达式,其中只有 \(\&\) 和 \(\mid\) 两种运算。
求:\(\&\) 和 \(\mid\) 运算中的“最短路”次数各出现了多少次。
最短路的定义为:
在 \(a\) \(\&\) \(b\) 运算中,如果 \(a = 0\),那么整个表达式的计算就不需要再继续进行了,因为表达式的值都一定为 \(0\)。
在 \(a\) \(\mid\) \(b\) 运算中,如果 \(a = 1\),表达式的值也不需要再继续计算了,一定为 \(1\)。
以上两种情况中的任何一种,都被称作一次“最短路”的情况。
思路
- 首先把中缀表达式转换为后缀表达式。
- 在计算后缀表达式的过程中,建立一颗表达式树。
- 最后 \(dfs\) 整棵树,看看最短路各出现了多少次。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
struct node{
char c;
int l, r, v;
} a[N];
stack<char> op;
stack<int> st;
vector<char> v;
char s[N];
int c1, c2;
void dfs(int x) {
if (a[x].l == 0 && a[x].r == 0) return;
int t1 = a[x].l, t2 = a[x].r;
dfs(t1);
if (a[x].c == '&' && a[t1].v == 0) { c1++; return; }
if (a[x].c == '|' && a[t1].v == 1) { c2++; return; }
dfs(t2);
}
int main() {
scanf("%s", s + 1);
for (int i = 1, len = strlen(s + 1); i <= len; i++) {
if (isdigit(s[i])) v.push_back(s[i]);
else if (s[i] == '(') op.push(s[i]);
else if (s[i] == ')') {
while (!op.empty() && op.top() != '(') {
v.push_back(op.top());
op.pop();
}
op.pop();
} else if (s[i] == '&') {
while (!op.empty() && op.top() == '&') {
v.push_back(op.top());
op.pop();
}
op.push(s[i]);
} else if (s[i] == '|') {
while (!op.empty() && (op.top() == '&' || op.top() == '|')) {
v.push_back(op.top());
op.pop();
}
op.push(s[i]);
}
}
while (!op.empty()) {
v.push_back(op.top());
op.pop();
}
int len = v.size(), k = 0;
for (int i = 0; i < len; i++) {
if (isdigit(v[i])) {
a[++k] = {0, 0, 0, v[i] - '0'};
st.push(k);
} else {
int x = st.top(); st.pop();
int y = st.top(); st.pop();
if (v[i] == '&') {
a[++k] = {v[i], y, x, a[y].v & a[x].v};
st.push(k);
} else {
a[++k] = {v[i], y, x, a[y].v | a[x].v};
st.push(k);
}
}
}
printf("%d\n", a[k].v);
dfs(k);
printf("%d %d", c1, c2);
return 0;
}
P8815 [CSP-J 2022] 逻辑表达式的更多相关文章
- CSP J/S 初赛总结
CSP J/S 初赛总结 2021/9/19 19:29 用官方答案估计 J 涂卡的时候唯一的一支 2B 铅笔坏了,只能用笔芯一个个涂 选择 \(-6\ pts\) 判断 \(-3\ pts\) 回答 ...
- 【游记】CSP J/S 2019 游记
J 组 \(2:30\)开始, \(2:13\)还在酒店的我看了看手表...飞奔考场. T1 数字游戏 秒切. 下午某中学某大佬说可用线性基(%) T2 公交换乘 用单调队列思想,秒切. T3 纪念品 ...
- CSP/S 2022 游寄
初赛 HN 初赛分数线好像大 \(32\) 分左右,通过率极高!本人弱弱的拿了 \(60.5\) 分(周围的同学平均分 \(>80\).) Day -1 这一天晚上,我背了背 dijkstra, ...
- 2019 CSP J/S第2轮 视频与题解
CSP入门组和提高组第二轮题解 转自网络
- CSP J/S 2019受虐记
一枚蒟蒻的游记~ 提高组DAY1 不是说每场考试都有一道签到题吗 那我tm读了三遍题硬是没找到一道水题是怎么回事(是我太弱了吗) 没办法,硬着头皮做T1 暴力写法...期望得分30pts 于是...在 ...
- [ 赛后总结 ] CSP-J 2022
前言 今年没考好,估分 100+60+0+10=170pts ,大概能混个2=,没什么用. 这下好了,期中也砸了,已经排到全校 30 开外了,果然鱼和熊掌不可兼得,况且我双双落空,接下来怕是想搞也搞不 ...
- 2022 CSP-J 游记
Day − ∞ -\infty −∞ 在家里跟父母约定 "只要csp-j一等奖,手机随你挑!" 对于一个没有手机的初中生废物,这个约定显然勾引了我 刷题! 刷题! 再刷! 刷废-- ...
- [游记]2020/CSP - S总结
2020 / C S P − S 总 结 2020/CSP - S总结 2020/CSP−S总结 这年的 C S P CSP CSP考的不是很理想,本来稳进的 C S P − J CSP-J CSP− ...
- CSP2022 J2参考解析
目录 P8813 [CSP-J2022] 乘方 P8814 [CSP-J2022] 解密 P8815 [CSP-J2022] 逻辑表达式 P8816 [CSP-J2022] 上升点列 题目传送: P8 ...
- emacs考场短配置
(set-background-color "gray15") (set-foreground-color "gray") ;;设置颜色 (global-set ...
随机推荐
- ASP.NET MVC4 学习笔记-2
渲染网页-Randering Web Pages 前面示例的输出结果不是HTML,而是一个"Hello World"的字符串.为了响应浏览器的请求产生一个HTML网页,我们需要创建 ...
- 使用官方推荐的库来测react hook组件
最近写单元测试的时候遇见了一些问题,当我使用使用jest测React. useRef, React. useEffect时,总是测不到, 然后我去查阅了一下官方文档,它推荐了使用下面这个库 @tes ...
- JVM虚拟机栈
JVM虚拟机栈 1.概述 1.1背景 由于跨平台性的设计,Java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降 ...
- Codeforces Round #888 (Div. 3) A-G
比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...
- <学习笔记> 关于二项式反演
1 容斥原理的式子: \[|A1∪A2∪...∪An|=\sum_{1≤i≤n}|Ai|−\sum_{1≤i<j≤n}|Ai∩Aj|+...+(−1)^{n−1}×|A1∩A2∩...∩An| ...
- 基于C#的窗体阴影效果方案 - 开源研究系列文章
最近在研究C#的Winform窗体的效果,上次介绍了窗体动画效果的博文( 基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章 ),这次将窗体阴影效果的方案进行一个介绍. 找了一下度娘,具 ...
- SpringSecurity1: spring boot web 样例快速体验
本文只讲操作实践,不讲原理,这样对于想快速搭建起一个基于SpringSecurity的Web项目的朋友们而言,比较友好.文章主要由两部分构成: 快速演示样例 所有账户和授权数据均基于内存,能在极短的时 ...
- Javascript执行原理 网页引入javascript的三种方式* javascript核心语法 数据类型 Typeof运算符
Javascript执行原理: 用户端发送请求到服务器端 将js解析出来的数据(用户身份表示)绑定在请求路径中 服务器端获取到参数后会响应客户端 客户端通过浏览器解析响应的数据并将数据展现在浏览器上 ...
- 自定义组件使用v-model
场景描述 我们在一个系统中,会出现这样的情况, 有一个联系人的下拉框,这个下拉框中的数据是从服务端获取的. 在很多页面都需要使用这个联系人(下拉框). 我们通常是这样做的: 写一个下拉框组件然后调用接 ...
- ctfshow--web入门--文件上传
ctfshow--web入门--文件上传 web151(前端校验) 题目中提示前端检验不可靠,应该对前端检验进行绕过 检查前端代码进行修改,使php文件可以通过前端校验,成功上传后进行命令执行,找到f ...