【洛谷P1310 表达式的值】
题目描述
对于1 位二进制变量定义两种运算:
运算的优先级是:
先计算括号内的,再计算括号外的。
“× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算。例如:计算表达式A⊕B × C时,先计算 B × C,其结果再与 A 做⊕运算。
现给定一个未完成的表达式,例如_+(_*_),请你在横线处填入数字00或者11 ,请问有多少种填法可以使得表达式的值为00。
输入输出格式
输入格式:
共 2 行。
第1 行为一个整数 LL,表示给定的表达式中除去横线外的运算符和括号的个数。
第2 行为一个字符串包含 LL 个字符,其中只包含’(’、’)’、’+’、’*’这44 种字符,其中’(’、’)’是左右括号,’+’、’*’分别表示前面定义的运算符“⊕”和“×”。这行字符按顺序给出了给定表达式中除去变量外的运算符和括号。
输出格式:
共1 行。包含一个整数,即所有的方案数。注意:这个数可能会很大,请输出方案数对1000710007取模后的结果。
输入输出样例
说明
【输入输出样例说明】
给定的表达式包括横线字符之后为:_+(_*_)
在横线位置填入(0 、0 、0) 、(0 、1 、0) 、(0 、0 、1) 时,表达式的值均为0 ,所以共有3种填法。
【数据范围】
对于20\%20% 的数据有0 ≤ L ≤ 100≤L≤10。
对于50\%50% 的数据有 0 ≤ L ≤ 1,0000≤L≤1,000。
对于70\%70% 的数据有0 ≤ L ≤ 10,0000≤L≤10,000 。
对于100\%100%的数据有0 ≤ L ≤ 100,0000≤L≤100,000。
对于50\%50% 的数据输入表达式中不含括号。
就是一个十分有趣恶心的堆栈题
这里显然运用到了位运算(ex的东西)
运用堆栈,遇见*和(就入栈,遇见)就将(与)之间的符号出栈,遇见+就将前面的*出栈
以此来模拟(其中‘n’表示一个未知的数值)
直到最后算完表达式,输出为0的方案数
- #include<bits/stdc++.h>
- using namespace std;
- inline void read(int &num)
- {
- bool flag=;
- num=;
- char c=getchar();
- while((c<''||c>'')&&c!='-')
- {
- c=getchar();
- }
- if(c=='-')
- {
- flag=;
- c=getchar();
- }
- num=c-'';
- c=getchar();
- while(c>=''&&c<='')
- {
- num=(num<<)+(num<<)+c-'';
- c = getchar();
- }
- if(flag)
- {
- num*=-;
- }
- }
- inline void output(int num)
- {
- if(num<)
- {
- putchar('-');
- num=-num;
- }
- if(num>=)
- {
- output(num/);
- }
- putchar(num%+'');
- }
- inline void outln(int num)
- {
- output(num);
- }
- inline void outln(string str)
- {
- puts(str.c_str());
- }
- const int mod=;
- const int N=;
- int n;
- char str[N];//输入的中缀表达式
- stack<char> sta;//转后缀表达式时使用的栈
- string final;//后缀表达式(答案序列)
- stack<int> zero, one;//zero维护使表达式值为0的方案个数,one维护使表达式值为1的方案个数
- int main()
- {
- read(n);
- scanf("%s",str + );
- final.push_back('n');//后缀表达式最开始应该有一个未知变量
- for(int i=;i<=n;i++)
- {
- if(str[i]=='('||str[i]=='*')//遇到左括号或乘号,入栈
- {
- sta.push(str[i]);
- }
- if(str[i]=='+')//遇到加号,弹出栈顶的乘号,然后加号入栈
- {
- while(!sta.empty()&&sta.top()=='*')
- {
- final.push_back(sta.top());
- sta.pop();
- }
- sta.push(str[i]);
- }
- if(str[i]==')')//右括号,把到上一个左括号的元素出栈放入答案序列
- {
- while(sta.top()!='(')
- {
- final.push_back(sta.top());
- sta.pop();
- }
- sta.pop();
- }
- if(str[i]!='('&&str[i]!=')')//当不是左括号或者右括号时,应该插入一个未知变量
- {
- final.push_back('n');
- }
- }
- while(!sta.empty())//剩下的元素放入答案序列
- {
- final.push_back(sta.top());
- sta.pop();
- }
- for(int i=;i<final.size();i++)
- {
- char c=final[i];
- {
- if(c=='n')//单个变量,方案数为1
- {
- one.push();
- zero.push();
- }
- else
- {
- int rone=one.top(),rzero=zero.top();//rone表示右操作数(即上文中的y)为1的方案数(即上文中的y1),rzero同理
- one.pop(),zero.pop();
- int lone=one.top(),lzero=zero.top();//同理
- one.pop();
- zero.pop();
- if(c == '*')//与操作,为1需要都为1,为0需要不都为1
- {
- one.push(lone*rone%mod);
- zero.push((lone*rzero%mod+lzero*rone%mod+lzero*rzero%mod)%mod);
- }
- else//或操作,为0需要都为0,为1需要不都为0
- {
- zero.push(lzero*rzero%mod);
- one.push((lone*rzero%mod+lzero*rone%mod+lone*rone%mod)%mod);
- }
- }
- }
- }
- outln(zero.top());//需要整个表达式的值为0
- return ;
- }
【洛谷P1310 表达式的值】的更多相关文章
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- 洛谷 P1310 表达式的值 解题报告
P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. "× "运算优先于"⊕"运算,即计算表 ...
- 洛谷P1310 表达式的值
P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例 ...
- 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用
题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...
- 洛谷P1310 表达式的值——题解
题目传送 题的难点:1.有运算优先级,不好判断.2.有破坏整体和谐性的讨厌的括号.3.不知道哪里要填数.4.要求方案数很大,搜索不会做呐. 发现难点1和2都是中缀表达式的缺点.转成后缀表达式后难点1. ...
- 洛谷 P1981 表达式求值
P1981 表达式求值 题目描述 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入输出格式 输入格式: 输入文件为 expr.in. 输入仅有一行,为需要你计算的表达式,表达式中只 ...
- 题解-洛谷P1981 表达式求值(模拟+处理优先级的递归)
https://www.luogu.org/problemnew/show/P1981 (原题链接) 显然乘法的优先级高与加法,因此碰到乘号就要优先把一连串与乘号相连的数算出,很容易想到递归.可用普通 ...
- 洛谷P1981 表达式求值 题解 栈/中缀转后缀
题目链接:https://www.luogu.org/problem/P1981 这道题目就是一道简化的中缀转后缀,因为这里比较简单,只有加号(+)和乘号(*),所以我们只需要开一个存放数值的栈就可以 ...
- 洛谷 P1981 表达式求值(模拟)
嗯... 题目链接:https://www.luogu.org/problem/P1981 这道题其实是数组模拟栈.首先处理乘法:注意从后往前处理,处理后归零.然后把数都加起来即可. AC代码: #i ...
随机推荐
- java 覆盖
作者:又见那斯 java中覆盖基于面向对象三大特征之:继承,同时又和另一特征:多态有重要的联系,本文中讨论的有关java中覆盖的一些知识,其实在写代码的时候或许不会用到,不过知道的话总会有用处.如有错 ...
- python中虚拟环境virtualenvwrapper的安装和使用
虚拟环境为什么需要虚拟环境: 到目前为止,我们所有的第三方包安装都是直接通过 pip install xx 的方式进行安装的,这样安装会将那个包安装到你的系统级的 Python 环境中.但 ...
- textarea标签输出内容时不能顶格(左对齐)输出
我用textarea输出文本内容的时候出现下面的问题:文本内容在action里测试没有问题(文本内容前面没有空格),但是在jsp页面textare标签中输出文本内容时,文本内容前面却出现一些多余的空格 ...
- linux Nginx 的安装
确保安装了 gcc,openssl-devel,pcre-devel,zilb-devel 下载官网:http://nginx.org/ [root@localhost tools]# wget ht ...
- Maven 添加其他Maven组件配置问题
在父工程的pom文件里,添加如下配置 <project> <!--其它配置--> <modules> <module>A项目文件夹</module ...
- 最长公共子序列板/滚动 N^2
#include <bits/stdc++.h> using namespace std; int main() { ][],t; ],b[]; bool now,pre; scanf(& ...
- centos 挂载windows 2003 smb
mount -t cifs //10.100.100.250/产品服务器/待测库/FI\ Cloud/CICD/BuildRoot_Dev/ /cicd --verbose -o vers=1.0,u ...
- Attention Points
Attention Points 数组范围 无向图.树,边表的范围是边数的两倍. 因为最近树的题目做的比较多,一定要注意分清是树还是图,不能冲上去就去开struct Edge{int to,ne,w; ...
- PKUSC2019颓废记
Day -x \(THU\):"想过初审?gck" 我:"你说gck,那就gck⑧" 于是就来\(PKU\)碰碰运气了 Day 0 为了赶高铁起的很早. 颓了一 ...
- 文本检错——中文拼写检查工具FASPell
最近因为相关项目需要考虑中文文本检错,然后就发现了爱奇艺发布的号称SOTA的FASPell已经开源代码,所以开始着手实现. 检错思想两步:一,掩码语言模型(MLM)产生候选字符:二,CSD过滤候选字符 ...