题目链接

题目描述

对于1 位二进制变量定义两种运算:

运算的优先级是:

  1. 先计算括号内的,再计算括号外的。

  2. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算。例如:计算表达式A⊕B × C时,先计算 B × C,其结果再与 A 做⊕运算。

现给定一个未完成的表达式,例如_+(_*_),请你在横线处填入数字00或者11 ,请问有多少种填法可以使得表达式的值为00。

输入输出格式

输入格式:

共 2 行。

第1 行为一个整数 LL,表示给定的表达式中除去横线外的运算符和括号的个数。

第2 行为一个字符串包含 LL 个字符,其中只包含’(’、’)’、’+’、’*’这44 种字符,其中’(’、’)’是左右括号,’+’、’*’分别表示前面定义的运算符“⊕”和“×”。这行字符按顺序给出了给定表达式中除去变量外的运算符和括号。

输出格式:

共1 行。包含一个整数,即所有的方案数。注意:这个数可能会很大,请输出方案数对1000710007取模后的结果。

输入输出样例

输入样例#1: 复制

4
+(*)
输出样例#1: 复制

说明

【输入输出样例说明】

给定的表达式包括横线字符之后为:_+(_*_)

在横线位置填入(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 表达式的值】的更多相关文章

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

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

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

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

  3. 洛谷P1310 表达式的值

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

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

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

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

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

  6. 洛谷 P1981 表达式求值

    P1981 表达式求值 题目描述 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入输出格式 输入格式: 输入文件为 expr.in. 输入仅有一行,为需要你计算的表达式,表达式中只 ...

  7. 题解-洛谷P1981 表达式求值(模拟+处理优先级的递归)

    https://www.luogu.org/problemnew/show/P1981 (原题链接) 显然乘法的优先级高与加法,因此碰到乘号就要优先把一连串与乘号相连的数算出,很容易想到递归.可用普通 ...

  8. 洛谷P1981 表达式求值 题解 栈/中缀转后缀

    题目链接:https://www.luogu.org/problem/P1981 这道题目就是一道简化的中缀转后缀,因为这里比较简单,只有加号(+)和乘号(*),所以我们只需要开一个存放数值的栈就可以 ...

  9. 洛谷 P1981 表达式求值(模拟)

    嗯... 题目链接:https://www.luogu.org/problem/P1981 这道题其实是数组模拟栈.首先处理乘法:注意从后往前处理,处理后归零.然后把数都加起来即可. AC代码: #i ...

随机推荐

  1. HDU 5266 pog loves szh III ( LCA + SegTree||RMQ )

    pog loves szh III Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Oth ...

  2. 制作的第一个java小游戏

    package java1; import java.awt.*; public class java1 extends Frame { //球桌和桌球图片 Image ball = Toolkit. ...

  3. 如何将一个.NET Core类库发布到NuGet

    包治百病 | 如何将一个.NET Core类库发布到NuGet 写文章 包治百病 | 如何将一个.NET Core类库发布到NuGet Edi Wang发表于汪宇杰博客订阅 77 NuGet是.NET ...

  4. 说说 HeapSort 堆排序思想,以及个人优化方案。(老物)

    听说你要排上亿个数据之 HeapSort ? 前言 : 来来来,今天我们来说说一个用来排大量数据所用的基础比较排序吧~ 注:阅读本文学习新技能的前置要求为:了解什么是二叉树及其数组性质,如果未达到要求 ...

  5. 【React 8/100】 React路由

    React路由 React路由介绍 现代的前端应用大多数是SPA(单页应用程序),也就是只有一个HTML页面的应用程序.因为它的用户体验更好.对服务器压力更小,所以更受欢迎.为了有效的使用单个页面来管 ...

  6. ioncube扩展的安装详细图文教程,适合所有新手

    有些程序在php环境下运行需要安装ionCube Loader的扩展支持,这里跳过介绍这些东西直接说一下怎么让你的主机环境支持这种扩展,顺利的让你的程序运行起来!这个教程适合用云服务器或者独立服务器的 ...

  7. linux MySQL 初始化数据库

    #创建数据目录并且初始化 /bin/mysql_install_db –user=mysql

  8. thinkphp5 select对象怎么转数组?

    DB操作返回是数组.模型直接操作返回是对象 对象类型转换数组打开 database.php 增加或修改参数'resultset_type' => '\think\Collection',即可连贯 ...

  9. Python字符串(str)方法调用

    # str# n = 'pianYU'# v = n.capitalize() # 将字符串的首字母大写# print(v)## n = 'pianYI'# v1 = n.isupper() # 判断 ...

  10. pandas的数据统计函数

    # 1汇总类统计 # 2唯一去重和按值计数 # 3 相关系数和协方差 import pandas as pd # 0 读取csv数据 df = pd.read_csv("beijing_ti ...