P1054 等价表达式
题目描述
明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。
这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?
这个选择题中的每个表达式都满足下面的性质:
- 表达式只可能包含一个变量‘aa’。
- 表达式中出现的数都是正整数,而且都小于1000010000。
- 表达式中可以包括四种运算
+
(加),-
(减),*
(乘),^
(乘幂),以及小括号(
,)
。小括号的优先级最高,其次是^
,然后是*
,最后是+
和-
。+
和-
的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符+
,-
,*
,^
以及小括号(
,)
都是英文字符) - 幂指数只可能是11到1010之间的正整数(包括11和1010)。
- 表达式内部,头部或者尾部都可能有一些多余的空格。
下面是一些合理的表达式的例子:
((a^1) ^ 2)^3
,a*a+a-a
,((a+a))
,9999+(a-a)*a
,1 + (a -1)^3
,1^10^9
………
输入输出格式
输入格式:
第一行给出的是题干中的表达式。
第二行是一个整数n(2 \le n \le 26)n(2≤n≤26),表示选项的个数。后面nn行,每行包括一个选项中的表达式。这nn个选项的标号分别是A,B,C,D…A,B,C,D…
输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。
输出格式:
一行,包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。
输入输出样例
( a + 1) ^2
3
(a-1)^2+4*a
a + 1+ a
a^2 + 2 * a * 1 + 1^2 + 10 -10 +a -a
AC
说明
对于30%的数据,表达式中只可能出现两种运算符‘+’和-
;
对于其它的数据,四种运算符+
,-
,*
,^
在表达式中都可能出现。
对于全部的数据,表达式中都可能出现小括号(
和)
。
2005年提高组第四题
Solution:
Noip的题目,满满的恶意((・◇・)?读入有毒啊!)。
读入一行字符串,本题不能用gets或者cin.getline(因为我试了),所以得手写读入(判断换行'\n'和回车'\r')。
思路就是随便代10个数计算每个表达式的值,然后判断是否都相等就好了。
求的话可以用双栈模拟(一个存数,一个单调维护符号优先级),或者递归求,递归过程直接区间从后往前,用hash的思路统计算术优先级(优先级:'('>'^'>'*'>'+'='-'>')'),优先运算优先级高的就好了。
代码:
/*Code by 520 -- 8.31*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=,mod=1e9+;
int n,len[N],sum[N];
char s[][N],t[N]; il ll fast(ll x,ll k){
ll ans=;
while(k){
if(k&) ans=ans*x%mod;
k>>=;
x=x*x%mod;
}
return ans;
} int p[N];
ll dfs(char *s,int l,int r,int x){
int tot=,minn=0x7fffffff,pos=l,cnt=,num=;
memset(p,0x3f,sizeof(p));
Bor(i,l,r){
if(s[i]==')') tot+=;
if(s[i]=='(') tot-=;
if(s[i]=='^') p[i]=tot+,cnt++;
if(s[i]=='*') p[i]=tot+,cnt++;
if(s[i]=='+'||s[i]=='-') p[i]=tot+,cnt++;
if(minn>p[i]) minn=p[i],pos=i;
}
if(!cnt){
For(i,l,r) if(s[i]=='a')return x;
For(i,l,r) if(isdigit(s[i])) num=(num<<)+(num<<)+(s[i]^);
return num;
}
if(s[pos]=='^') return fast(dfs(s,l,pos-,x),dfs(s,pos+,r,x));
if(s[pos]=='*') return dfs(s,l,pos-,x)*dfs(s,pos+,r,x)%mod;
if(s[pos]=='+') return (dfs(s,l,pos-,x)+dfs(s,pos+,r,x))%mod;
if(s[pos]=='-') return (dfs(s,l,pos-,x)-dfs(s,pos+,r,x))%mod;
return ;
} il void get(char *a){
char c=getchar();
int cnt=;
while(c=='\n'||c=='\r') c=getchar();
while(c!='\n'&&c!='\r') a[cnt++]=c,c=getchar();
a[cnt]='\0';
} int main(){
get(t),len[]=strlen(t);
cin>>n;
For(i,,n) get(s[i]),len[i]=strlen(s[i]);
For(i,,) sum[i]=dfs(t,,len[]-,i-);
For(i,,n) {
bool f=;
For(j,,) if(sum[j]!=dfs(s[i],,len[i]-,j-)){f=;break;}
if(!f)printf("%c",'A'+i-);
}
return ;
}
P1054 等价表达式的更多相关文章
- 洛谷 P1054 等价表达式 解题报告
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷P1054 等价表达式
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷 P1054 等价表达式
洛谷 P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式, ...
- 【数据结构】P1054 等价表达式
[题目链接] https://www.luogu.org/problem/P1054 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数 ...
- [NOIP2005] 提高组 洛谷P1054 等价表达式
题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数 ...
- 等价表达式 2005年NOIP全国联赛提高组(栈模拟)
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 数据结构--栈 codevs 1107 等价表达式
codevs 1107 等价表达式 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Descripti ...
- 等价表达式(noip2005)
3.等价表达式 [问题描述] 兵兵班的同学都喜欢数学这一科目,中秋聚会这天,数学课代表给大家出了个有关代数表达式的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也 ...
- 表达式求值(noip2015等价表达式)
题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...
随机推荐
- Linux 删除用户时报错:userdel: user zhoulijiang is currently used by process 1
一.发现问题: 有技术人员离职,需要删除系统帐号,但是进行删除操作的时候报:" userdel: user zhoulijiang is currently used by process ...
- bzoj1011 遥远的行星
bzoj1011 遥远的行星 原题链接 题解 一道真正的玄学题.... 其实这题根本没法做 首先暴力这么跑:\[ans(s)=\sum_{i=1}^{\lfloor As\rfloor}\frac{M ...
- 一起来做chrome扩展《页面右键菜单》
本文主要内容 contextMenus的设置 打开权限 创建菜单 点击菜单 background script向content script发送消息 1. contextMenus的设置 1.1 打开 ...
- SQL Server 2008 R2 链接 Oracle 10g
首先sqlserver 链接oracle可以通过两个访问接口: “MSDAORA” 和“OraOLEDB.Oracle” 1.“MSDAORA”访问接口是由Microsoft OLE DB Provi ...
- GitHub中webhooks的使用
目录 GitHub中的webhooks的配置 对配置的webhooks的进行测试 目前在团队在设计一个应用管理的功能,需要了解到常用代码托管的Webhooks的使用.GitHub中的webhooks首 ...
- selenium 结合 docker 构建分布式测试环境 (初学者视角)
前言:随着自动化测试越学越深,深深觉得有太多的东西需要总结. 1.记录下学习中遇到的坑,当做学习笔记.2.有前人路过看到文章中比较落后的做法,请务必一定要指教.(因为是初学者视角,很多东西只是走通而已 ...
- 二、Django快速安装
一.安装Python 作为一个Python Web框架,Django依赖Python.从Django适用于哪些版本的Python可以获取更多信息.较新版本的Python内置一个轻量级的数据库SQLit ...
- halcon学习相关资料(转载)
https://blog.csdn.net/maweifei/article/details/78162581 论坛.培训 halcon学习网:http://www.ihalcon.com/ 鸟叔机器 ...
- 撤销 git merge
由于太多人问怎么撤销 merge 了,于是 git 官方出了这份教程,表示在 git 现有的思想体系下怎么达到撤销 merge 的目标. 方法一,reset 到 merge 前的版本,然后再重做接下来 ...
- Thunder团队第七周 - Scrum会议5
Scrum会议5 小组名称:Thunder 项目名称:i阅app Scrum Master:邹双黛 工作照片: 宋雨沉迷于照相无法自拔,所以不在相片中. 参会成员: 王航:http://www.cnb ...