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.中缀转后缀规则

考虑用栈维护。

遍历中缀表达式:

  1. 遇到数字,直接放入答案序列

  2. 遇到左括号,入栈

  3. 遇到右括号,把栈顶到上一个左括号的元素依次出栈并放入答案序列
  4. 遇到乘号,入栈
  5. 遇到加号,从栈顶开始弹出这段连续的乘号,并放入答案序列,最后加号入栈
  6. 最后把栈里剩下的元素依次放入答案序列

代码

#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

water-lift

P1310 表达式的值的更多相关文章

  1. 洛谷 P1310 表达式的值 解题报告

    P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. "× "运算优先于"⊕"运算,即计算表 ...

  2. 洛谷P1310 表达式的值

    P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例 ...

  3. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

  4. 【数据结构】P1310 表达式的值

    [题目链接] https://www.luogu.org/problem/P1310 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先 ...

  5. luogu P1310 表达式的值

    题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...

  6. 【洛谷P1310 表达式的值】

    题目链接 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式 ...

  7. 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用

    题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...

  8. 洛谷P1310 表达式的值——题解

    题目传送 题的难点:1.有运算优先级,不好判断.2.有破坏整体和谐性的讨厌的括号.3.不知道哪里要填数.4.要求方案数很大,搜索不会做呐. 发现难点1和2都是中缀表达式的缺点.转成后缀表达式后难点1. ...

  9. P1981 表达式求值

    P1981 表达式求值 题解 这个题联想一下  P1310 表达式的值  思路就是输入中缀式,转成后缀式,然后按后缀式计算,完美!!       but!! 会严重RE,因为你可能会输入中缀式的时候输 ...

随机推荐

  1. mysql存储、function、触发器等实例

    一.创建数据库&表 DROP DATABASE IF EXISTS security; CREATE database security; USE security; CREATE TABLE ...

  2. Oracle数据库使用游标查询结果集所有数据

    --Oracle使用游标查询结果集所有数据 DECLARE myTabelName NVARCHAR2():=''; --表名 myTableRowComment NVARCHAR2():=''; - ...

  3. P2015 二叉苹果树[树形dp+背包]

    题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来 ...

  4. java发送邮件javamail, freemarker读取html模板内容

    https://www.cnblogs.com/xdp-gacl/p/4216311.html 一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件 ...

  5. ztree树默认根据ID默认选中该条数据

    functiongetZtree() { varsetting = { view: { expandSpeed: 100, selectedMulti: true, showLine: true, / ...

  6. YAML_06 playbook从上往下顺序执行,若报错,不提示,继续往下执行

    ansible]# vim user4.yml --- - hosts: cache   remote_user: root   vars:     user: bb   tasks:    - sh ...

  7. C# Ninject使用

    Ninject是一个IOC容器,用来解决程序中组件的耦合问题,它的目的在于做到最少配置.简单来讲就是 为我们选择一个想要的类来处理事务. 百度百科的解释:一个快如闪电.超轻量级的基于.Net平台的依赖 ...

  8. zabbix sender

    在zabbix中自定义一个虚拟主机,自定义key值,一般运用的是自动发现规则,给清单规则中配置上宏变量,通过py脚本调动zabbixsender模块,给这个主机,host发送一组包含键和宏变量的值,这 ...

  9. Ubuntu shell系统的环境变量

    1.系统环境变量env命令查看 1)利用export命令导出环境变量 export PS1 导出PS1 添加路径 export PATH=$PATH:/home/daokr/myfile $ sudo ...

  10. NOIP2015 D1 解题报告

    T1 神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1 ...