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] 逻辑表达式的更多相关文章

  1. CSP J/S 初赛总结

    CSP J/S 初赛总结 2021/9/19 19:29 用官方答案估计 J 涂卡的时候唯一的一支 2B 铅笔坏了,只能用笔芯一个个涂 选择 \(-6\ pts\) 判断 \(-3\ pts\) 回答 ...

  2. 【游记】CSP J/S 2019 游记

    J 组 \(2:30\)开始, \(2:13\)还在酒店的我看了看手表...飞奔考场. T1 数字游戏 秒切. 下午某中学某大佬说可用线性基(%) T2 公交换乘 用单调队列思想,秒切. T3 纪念品 ...

  3. CSP/S 2022 游寄

    初赛 HN 初赛分数线好像大 \(32\) 分左右,通过率极高!本人弱弱的拿了 \(60.5\) 分(周围的同学平均分 \(>80\).) Day -1 这一天晚上,我背了背 dijkstra, ...

  4. 2019 CSP J/S第2轮 视频与题解

    CSP入门组和提高组第二轮题解 转自网络

  5. CSP J/S 2019受虐记

    一枚蒟蒻的游记~ 提高组DAY1 不是说每场考试都有一道签到题吗 那我tm读了三遍题硬是没找到一道水题是怎么回事(是我太弱了吗) 没办法,硬着头皮做T1 暴力写法...期望得分30pts 于是...在 ...

  6. [ 赛后总结 ] CSP-J 2022

    前言 今年没考好,估分 100+60+0+10=170pts ,大概能混个2=,没什么用. 这下好了,期中也砸了,已经排到全校 30 开外了,果然鱼和熊掌不可兼得,况且我双双落空,接下来怕是想搞也搞不 ...

  7. 2022 CSP-J 游记

    Day − ∞ -\infty −∞ 在家里跟父母约定 "只要csp-j一等奖,手机随你挑!" 对于一个没有手机的初中生废物,这个约定显然勾引了我 刷题! 刷题! 再刷! 刷废-- ...

  8. [游记]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− ...

  9. CSP2022 J2参考解析

    目录 P8813 [CSP-J2022] 乘方 P8814 [CSP-J2022] 解密 P8815 [CSP-J2022] 逻辑表达式 P8816 [CSP-J2022] 上升点列 题目传送: P8 ...

  10. emacs考场短配置

    (set-background-color "gray15") (set-foreground-color "gray") ;;设置颜色 (global-set ...

随机推荐

  1. 跟运维学 Linux - 01

    跟运维学 Linux - 01 运维的诞生 运维工程师有很多叫法:系统运维.Linux 工程师.系统管理员... 网管可以说是运维工程师最早的雏形.在个人电脑未普及时,大家去网吧玩游戏. 玩家:&qu ...

  2. MAUI Blazor如何隐藏滚动条

    MAUI Blazor如何隐藏滚动条 Windows 在Windows上是最简单的,改css就可以了,把下面这段添加到app.css中 ::-webkit-scrollbar { display: n ...

  3. volatile是如何保证有序性的?

    为什么需要保证有序性? 有如下代码,在int i = a;执行了的情况下,i的值最终会为几? public class NoVolatileExample { int a = 0; boolean f ...

  4. 2022-1-10 控件学习1 TextBlock、Lable、TextBox

    TextBlock LineBreak:在指定位置手动换行和<br/>类似 TextTrimming: CharacterEllipsis没有足够空间时显示...,WordEllpsis以 ...

  5. C#.NET 国密SM4对称加解密 与JAVA互通 ver:20230731

    C#.NET 国密SM4对称加解密 与JAVA互通 ver:20230731 .NET 环境:.NET6 控制台程序(.net core). JAVA 环境:JAVA8,带maven 的JAVA控制台 ...

  6. GIT保存记录原理之commit对象

    GIT 中提交对象非常的重要,我们通过它记录代码提交过程.进行文件保存.回退等操作,那么它是怎样帮助我们记录这些信息的呢?其实就是都保存在项目根目录的 .git 文件夹中. 新建空项目 ```gitD ...

  7. python实现创建一个银行类,这个类实现了两个方法,第一个方法可以将用户信息写入到文件中,第二个方法可以读取文件中的用户信息出来

    class bank: def user_info(self): a=input('请输入用户信息:') # 不写encoding = 'utf-8'中文会乱码 with open('info.txt ...

  8. ubuntu20.4操作指令合集

    每个指令前面尽量加上sudo,避免麻烦的权限问题 下载软件:sudo apt install 包名 开启/关闭防火墙(开启/关闭所有端口):sudo ufw enable/disable 防火墙状态: ...

  9. AI绘画| 迪士尼风格|可爱头像【附Midjourney提示词】

    Midjourney案例分享 图片预览 迪士尼风格|可爱头像 高清原图及关键词Prompt已经放在文末网盘,需要的自取 在数字艺术的新时代,人工智能绘画已经迅速崭露头角.作为最先进的技术之一,AI绘画 ...

  10. LeetCode 周赛上分之旅 #42 当 LeetCode 考树上倍增,出题的趋势在变化吗

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...