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. (多核DSP快速入门)SYS/BIOS入门

    (多核DSP快速入门)SYS/BIOS入门   原创文章 转载请注册来源http://blog.csdn.net/tostq 系列教程目录:http://blog.csdn.net/tostq/art ...

  2. 【Flask】 python学习第一章 - 创建与运行参数

    windos 创建环境 sudo pip install virtualenv   # 安装virtualenv virtualenv -p python dir_name cd dir_name p ...

  3. WSDL知识点

    WSDL 是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言. WSDL简介 1.什么是 WSDL? WSDL 指网络服务描述语言 WSDL 使用 X ...

  4. cal of easter egg

    在Linux中用cal命令查看1752年9月,发现3到13日全都消失了……

  5. python网络-静态Web服务器案例(29)

    一.静态Web服务器案例代码static_web_server.py # coding:utf-8 # 导入socket模块 import socket # 导入正则表达式模块 import re # ...

  6. gradle 构建scala程序

    一.build.gradle 二.gradle build ===================== 执行scala scala main.scala

  7. 基于h5+的微信支付,hbuilder打包

    1.打开app项目的manifest.json的文件,选择模块权限配置,将Payment(支付)模块添加至已选模块中 2.选择SDK配置,在plus.payment·支付中,勾选□ 微信支付,配置好a ...

  8. scala 基础知识 FAQ

    问题1: 抽象成员初始化规则 ① 父类先初始化 ② 在初始化的过程中,如果 val 发生重写,只有最后一个重写生效.前面的会变成零值,后面的会直接继承. 参考资料:https://docs.scala ...

  9. 关于jquery的事件委托-bind,live,delegate,on的区别发展

    1.bind()方法 (只能给已经存在的元素上绑定事件) 只能给调用它的时候已经存在的元素绑定事件,不能给未来新增的元素绑定事件. $('ul li').bind('click', function( ...

  10. RabbitMQ 关键词

    RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. RabbitMQ中间件分为服务端(RabbitMQ Server)和客户端 ...