P1310 表达式的值
P1310 表达式的值
题解
1.假设有两个布尔变量 x , y
x0表示使得x=0的方案数
x1表示使得x=1的方案数
y0表示使得y=0的方案数
y1表示使得y=1的方案数
| | 按位或 | & 按位与 |
| 0 0 -> 0 | 0 0 -> 0 |
| 0 1 -> 1 | 0 1 -> 0 |
| 1 0 -> 1 | 1 0 -> 0 |
| 1 1 -> 1 | 1 1 -> 1 |
then,
x | y=0 方案数为 x0*y0
x | y=1 方案数为 x0*y1+x1*y0+x1*y1
x & y=0 方案数为 x0*y1+x1*y0+x0*y0
x & y=1 方案数为 x1*y1
2.中缀转后缀规则
考虑用栈维护。
遍历中缀表达式:
遇到数字,直接放入答案序列
遇到左括号,入栈
- 遇到右括号,把栈顶到上一个左括号的元素依次出栈并放入答案序列
- 遇到乘号,入栈
- 遇到加号,从栈顶开始弹出这段连续的乘号,并放入答案序列,最后加号入栈
最后把栈里剩下的元素依次放入答案序列
代码
#include<bits/stdc++.h> using namespace std; const int mod=1e4+;
const int maxn=1e5+;
int n;
char zhong[maxn]; //输入的中序遍历
stack<char>sta; //栈
string hou; //转化的后缀表达式
stack<int> zero,one; //答案为0的方案数,答案为1的方案数 int main()
{
scanf("%d",&n);
scanf("%s",zhong+); //下标从1开始 hou.push_back('n'); //后缀表达式里一开始要有一个未知数 //中缀转后缀
for(int i=;i<=n;i++)
{
if(zhong[i]=='('||zhong[i]=='*')
sta.push(zhong[i]);
if(zhong[i]=='+')
{
while(!sta.empty()&&sta.top()=='*')
{
hou.push_back(sta.top());
sta.pop();
}
sta.push(zhong[i]);
}
if(zhong[i]==')')
{
while(sta.top()!='(')
{
hou.push_back(sta.top());
sta.pop();
}
sta.pop(); //弹出'('
}
if(zhong[i]!='('&&zhong[i]!=')')
hou.push_back('n'); //放入一个未知变量
} //栈里面剩余的存入后缀
while(!sta.empty())
{
hou.push_back(sta.top());
sta.pop();
} //遍历后缀
for(int i=;i<hou.size() ;i++)
{
char c=hou[i]; if(c=='n')
{
zero.push();
one.push();
}
else
{
int rone=one.top(),rzero=zero.top();
one.pop();
zero.pop();
//rone->y1 , rzero->y0 int lone=one.top(),lzero=zero.top();
one.pop();
zero.pop();
//lone->x1 , lzero->x0 if(c=='*')
{
one.push(lone*rone%mod);
zero.push((lone*rzero%mod+lzero*rone%mod+lzero*rzero%mod)%mod);
}
else
{
one.push((lone*rone%mod+lone*rzero%mod+lzero*rone%mod)%mod);
zero.push(lzero*rzero%mod);
}
}
} printf("%d",zero.top()); //输出答案 return ;
}
Thanks
P1310 表达式的值的更多相关文章
- 洛谷 P1310 表达式的值 解题报告
P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. "× "运算优先于"⊕"运算,即计算表 ...
- 洛谷P1310 表达式的值
P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例 ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- 【数据结构】P1310 表达式的值
[题目链接] https://www.luogu.org/problem/P1310 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先 ...
- luogu P1310 表达式的值
题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...
- 【洛谷P1310 表达式的值】
题目链接 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式 ...
- 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用
题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...
- 洛谷P1310 表达式的值——题解
题目传送 题的难点:1.有运算优先级,不好判断.2.有破坏整体和谐性的讨厌的括号.3.不知道哪里要填数.4.要求方案数很大,搜索不会做呐. 发现难点1和2都是中缀表达式的缺点.转成后缀表达式后难点1. ...
- P1981 表达式求值
P1981 表达式求值 题解 这个题联想一下 P1310 表达式的值 思路就是输入中缀式,转成后缀式,然后按后缀式计算,完美!! but!! 会严重RE,因为你可能会输入中缀式的时候输 ...
随机推荐
- TFTP启动内核、设备树,NFS启动FS
一.软硬件平台 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3.交换芯片MARVELL的88E6321. 二.问题 ...
- 【HICP Gauss】数据库 环境的搭建 -1
1.安装规则 1.主机名必须网络唯一 2.主机名必须两位数以上 可以中划线 不能下划线 3.固定IP地址 4.端口号 1888 新增账户 omm 用户组 dbgrp ,家目录 /home/ ...
- ACM算法模板 · 一些常用的算法模板-模板合集(打比赛专用)
ACM算法模板 · 一些常用的算法模板-模板合集(打比赛专用)
- readme.txt 为什么我们不重视
1.很多源码项目下面都有编译说明,readme 2.我们的电脑上每个目录都有很多文件,我们似乎可以建立一个readme.txt 知道是什么 节约一些时间
- springboot进行热部署项目
百度了挺多的热部署,一种就是idea中一个插件,但是听说还需要 花钱,而且效果还是不太好. 自己按照网上的经验配置了一种属于自己的热部署,下面是详细的配置过程: 一.就是引入热部署需要的依赖: < ...
- Centos7安装nginx后提示“Welcome to nginx on Fedora!”,conf.d目录下无default.conf文件
问题描述 在腾讯云centos7上安装nginx sudo yum install nginx 打开默认网页显示 Welcome to nginx on Fedora! 且 /etc/nginx/co ...
- 序列:SEQUENCE
一.序列介绍 Oracle的序列是一种数据库对象,主要作用是用来产生唯一值.序列被创建以后可以通过数据字典找到序列对象,因此序列可以被多个对象共享. 二.创建序列 序列使用CREATE SEQUENC ...
- Vue创建组件的三种方式
1.使用 Vue.extend 来创建全局的Vue组件 <div id="app"> <!-- 如果要使用组件,直接,把组件的名称,以 HTML 标签的形式,引入 ...
- 堆优化Prim 最小生成树 模板
#include <bits/stdc++.h> using namespace std; const int MAXN = 5005; const int MAXM = 200005; ...
- 非自增编号字段,避免生成重复编号(以pdfNo编号为例)RedisLock/ReadLock
非自增编号字段,避免生成重复编号(以pdfNo编号为例) 有个场景,用户查询延误航班信息,然后生产一个编号,默认第一个编号是1000001,其后新增的编号默认自增加1.每次有人来查延误信息,如果延误信 ...