洛谷 P1054 等价表达式

题目描述

明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。

这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?

这个选择题中的每个表达式都满足下面的性质:

  1. 表达式只可能包含一个变量‘ aa ’。
  2. 表达式中出现的数都是正整数,而且都小于 1000010000 。
  3. 表达式中可以包括四种运算+(加),-(减),*(乘),^(乘幂),以及小括号(,)。小括号的优先级最高,其次是^,然后是*,最后是+-+-的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符+-*^以及小括号()都是英文字符)
  4. 幂指数只可能是 11 到 1010 之间的正整数(包括 11 和 1010 )。
  5. 表达式内部,头部或者尾部都可能有一些多余的空格。

下面是一些合理的表达式的例子:

((a^1) ^ 2)^3a*a+a-a((a+a))9999+(a-a)*a1 + (a -1)^31^10^9………

输入输出格式

输入格式:

第一行给出的是题干中的表达式。

第二行是一个整数 n(2 \le n \le 26)n(2≤n≤26) ,表示选项的个数。后面 nn 行,每行包括一个选项中的表达式。这 nn 个选项的标号分别是 A,B,C,D…A,B,C,D…

输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。

输出格式:

一行,包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。

输入输出样例

输入样例#1: 复制

( a + 1) ^2
3
(a-1)^2+4*a
a + 1+ a
a^2 + 2 * a * 1 + 1^2 + 10 -10 +a -a

输出样例#1: 复制

AC

说明

对于30%的数据,表达式中只可能出现两种运算符‘+’和-
对于其它的数据,四种运算符+-*^在表达式中都可能出现。
对于全部的数据,表达式中都可能出现小括号()

思路:模拟

  有很多细节问题需要注意,尤其像括号不匹配等问题,虽然仅是个模拟,但是很麻烦

#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cctype>
#include<ctime>
#define maxn 50
#define max_len 10
using namespace std;
int mod;
int x[max_len], p[maxn+20], q[maxn+20];
char a[maxn+20], b[maxn+20];int power(int i, int j) {int ans = 1;while(j > 0) {if(j & 1) ans = (ans * i) % mod;i = (i * i) % mod, j >>= 1;}return ans;
}
void work() {switch(p[p[0]]) {case 1:q[q[0]-1] += q[q[0]];q[q[0]-1] %= mod;break;case 2:q[q[0]-1] -= q[q[0]];q[q[0]-1] %= mod;break;case 3:q[q[0]-1] *= q[q[0]];q[q[0]-1] %= mod;break;case 4:q[q[0]-1] = power(q[q[0]-1], q[q[0]]);break;case 5: p[0]--; return;case 6: p[0]--; return;}p[0]--, q[0]--;
}
int get(char s[], int x) {int i, j, k, len = strlen(s);p[0] = 0, q[0] = 1, q[1] = 0;for(i = 0; i < len; i++) {if(s[i] == ' ') continue;if(s[i] == 'a') {q[++q[0]] = x;continue;}if(isdigit(s[i])) {q[++q[0]] = s[i]-'0';while(isdigit(s[i+1]))q[q[0]] = (q[q[0]]*10 + s[++i]-'0') % mod;continue;}switch(s[i]) {case '(': p[++p[0]] = 5; break;case '+':while(p[0]>0 && p[p[0]]>0 && p[p[0]]<5) work();p[++p[0]] = 1; break;case '-':while(p[0]>0 && p[p[0]]>0 && p[p[0]]<5) work();p[++p[0]] = 2; break;case '*':while(p[0]>0 && p[p[0]]>2 && p[p[0]]<5) work();p[++p[0]] = 3; break;case '^':while(p[0]>0 && p[p[0]]>3 && p[p[0]]<5) work();p[++p[0]] = 4; break;case ')':while(p[0]>0 && p[p[0]]<5) work();if(p[p[0]] == 5) p[0]--; break;}}while(p[0]) work();if(q[0] == 1) return (q[1] + mod) % mod;return (q[2] + mod) % mod;
}int main() {srand(time(0));mod = rand() % 10000 + 100;int i, j, k, n;gets(a);for(i = 1; i < max_len; i++)x[i] = get(a, i);scanf("%d\n", &n);for(i = 0; i < n; i++) {gets(b);for(j = 1; j < max_len; j++)if(get(b, j) != x[j]) break;if(j >= max_len) printf("%c", 'A'+i);}return 0;
}

View Code

转载于:https://www.cnblogs.com/v-vip/p/9338799.html

洛谷 P1054 等价表达式相关推荐

  1. 信息学奥赛一本通 2006:【20CSPJ普及组】表达式 | 洛谷 P7073 [CSP-J2020] 表达式

    [题目链接] ybt 2006:[20CSPJ普及组]表达式 洛谷 P7073 [CSP-J2020] 表达式 [题目考点] 后缀表达式 表达式树 通过后缀表达式建立表达式树: 遍历后缀表达式字符串: ...

  2. 信息学奥赛一本通 1956:【11NOIP普及组】表达式的值 | 洛谷 P1310 [NOIP2011 普及组] 表达式的值

    [题目链接] ybt 1956:[11NOIP普及组]表达式的值 洛谷 P1310 [NOIP2011 普及组] 表达式的值 [题目考点] 表达式树 由带括号的中缀表达式构建表达式树 [解题思路] 思 ...

  3. 信息学奥赛一本通 1962:【13NOIP普及组】表达式求值 | 洛谷 P1981 [NOIP2013 普及组] 表达式求值

    [题目链接] ybt 1962:[13NOIP普及组]表达式求值 洛谷 P1981 [NOIP2013 普及组] 表达式求值 [题目考点] 栈 中缀表达式转后缀表达式,后缀表达式求值 中缀表达式求值 ...

  4. 栈——后缀表达式(洛谷 P1449)

    题目选自洛谷P1449 阅读一个后缀表达式的方法是:从左往右读式子,一旦遇到运算法,就往前取n个数,这个n取决于运算法有多少个参数,然后擦掉这些参数和这个运算符,把计算的结果写在那里.接下来重复刚才的 ...

  5. python输出一个简单的田字格、用函数简化其代码_Solution Method: 洛谷 P1001 A+B Problem(Python 3 基本输入输出方法及代码简化)...

    本文从 洛谷 P1001 A+B Problem 为例,讲一讲 Python 3 在算法竞赛中的一些基本输入输出方法,以及一些利用 Python 3 特性的代码简化 以下为本文将涉及的内容: inpu ...

  6. 洛谷P2057 【SHOI2007】善意的投票

    洛谷P2057 [SHOI2007]善意的投票 题目链接 这道题是最小割的一个经典应用:划分集合. 题目的意思就是就是将所有的小朋友分为两个集合:同意睡觉和不同意睡觉的.不同的集合之间的边都要断开. ...

  7. 洛谷--P1067 多项式输出

    题目描述 一元nn次多项式可用如下的表达式表示: 其中,a_ix^iai​xi称为ii次项,a_iai​ 称为ii次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式: ...

  8. uoj#348/洛谷P4221 [WC2018]州区划分(FWT)

    传送门(uoj) 传送门(洛谷) 全世界都会子集卷积就咱不会--全世界都在写\(FMT\)就咱只会\(FWT\)-- 前置芝士 或运算\(FWT\)或者\(FMT\) 左转洛谷模板区,包教包会 子集卷 ...

  9. *【洛谷 - P1025】数的划分(dfs 或 dp 或 母函数,第二类斯特林数Stirling)

    题干: 题目描述 将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5 1,5,1 5,1,1 问有多少种不同的分法. ...

最新文章

  1. 计算机林中鸟歌曲,励志歌曲曲-林中鸟
  2. lighttpd php7 源码安装,如何在CentOS 7上安装Lighttpd与PHP-FPM和MariaDB
  3. Vue指令实战:结合bootstrap做一个用户信息输入表格
  4. asp.net源碼坊論壇上線
  5. 重新认识错过(通向财富自由之路学习笔记十四)
  6. Leecode11. 盛最多水的容器——Leecode大厂热题100道系列
  7. 文献学习(part5)--Clustering by Passing Messages Between Data Points
  8. bzoj 4300 绝世好题 —— 思路
  9. 【C++基础学习】C++中union结构
  10. php property 获取,JavaScript中如何获取和设置property属性代码详解
  11. maya对象属性_了解每粒子属性和每对象属性
  12. 破解zip,WinRaR等压缩包加密
  13. 印象笔记Markdown样式美化
  14. ps一点通精品知识库
  15. 卡内基梅隆大学计算机硕士专业,2020年卡内基梅隆大学专业设置
  16. OSChina 周三乱弹 —— 致力于做一名优秀的女程序员鼓励师
  17. 中顶访客登记管理系统
  18. openCV绘制简单Sierpinski(分形)图形
  19. 编译ThingsBoard V3.3.2源码
  20. 西门子plc博图与优傲UR机器人进行Profinet通讯,s7-1200/1500 与UR机器人通讯,实际应用案例使用中

热门文章

  1. android-25是什么手机,25.手机摄影的20个常用APP
  2. hbuilder新建web apk项目_【CUCS】Ionic利用你喜欢的(html css js) web技术创建跨平台的移动app...
  3. python连接sql sever_R和python连接SQL sever 数据库操作
  4. envi栅格TIF数据进行分割_栅格数据镶嵌
  5. c语言运行程序没有,这个程序怎么运行?为什么显示没有exe??
  6. TMS320C55x的硬件结构
  7. 孙鑫MFC笔记之十六--Active控件
  8. 纯新手DSP编程--5.15--CCS简述
  9. js调用java_Js调用Java方法并互相传参的简单实例
  10. tpch测试mysql_MySQL数据库之MySQL-tpch 测试工具简要手册