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 ...
随机推荐
- 【Shell】数组
数组 bash 只支持一维数组. 数组下标从 0 开始,下标可以是整数或算术表达式,其值应大于或等于 0. 创建数组 # 创建数组的不同方式 nums=([2]=2 [0]=0 [1]=1) colo ...
- Android进阶-NDK技术
一.介绍 1.什么是ndk技术? 在学习ndk技术前,我们需要先了解一下JNI(Java Native Interface)技术,JNI技术是一种实现Java代码和C/C++代码之间交互的技术,它提供 ...
- 正确处理 CSV 文件的引号和逗号
CSV(Comma-Separated Values,逗号分割值),就是用纯文本的形式存储表格数据,最大的特点就是方便. 作为开发,我们经常面临导数据的问题,特别是后台系统,产品或者运营的同事常常会提 ...
- EchoMode的显示效果
1 import sys 2 from PyQt5.QtWidgets import QApplication, QLineEdit, QWidget, QFormLayout 3 4 class l ...
- Kitex微服务开发实践(ETCD服务注册)
服务注册通常用于分布式系统或微服务架构中,是一种用于管理和发现这些分布式服务的机制.它的目标是让服务能够动态地找到其他服务,并能够与其进行通信,而无需显式地配置其位置信息 本文简单讲述使用etcd进行 ...
- 2023牛客暑期多校训练营5 ABCDEGHI
比赛链接 A 题解 知识点:莫队,树状数组. 区间询问显然可以离线莫队,考虑端点移动对答案的影响. 不妨先考虑右端点右移一个位置,对答案的改变.假设右端点右移后在 \(r\) ,我们先要知道 \([l ...
- Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明
目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明 Hi3798MV200 恩兔N2 NS-1 (二): 制作 Ubuntu rootfs Hi3798MV200 恩兔N2 ...
- [nginx]定制http头信息
前言 修改http响应头信息,相关Nginx模块:ngx_http_headers_module expires 语法: expires [modified] time; expires [modif ...
- 【python笔记】高阶函数map、filter、reduce
前言 map().reduce().filter()是python的三个高阶函数.所谓高阶函数,指的是将函数作为参数并返回函数作为结果的函数.下面代码的sing_ready只是一个简单高阶函数示例: ...
- 【pandas小技巧】--字符串转数值
字符串转数字的用途和场景很多,其中主要包括以下几个方面: 数据清洗:在进行数据处理时,经常会遇到一些数据类型不匹配的问题,比如某些列中的字符串类型被误认为是数字类型,此时需要将这些字符串类型转换为数字 ...