洛谷 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+], q[maxn+];
char a[maxn+], b[maxn+]; int power(int i, int j) {
int ans = ;
while(j > ) {
if(j & ) ans = (ans * i) % mod;
i = (i * i) % mod, j >>= ;
}
return ans;
}
void work() {
switch(p[p[]]) {
case :
q[q[]-] += q[q[]];
q[q[]-] %= mod;
break;
case :
q[q[]-] -= q[q[]];
q[q[]-] %= mod;
break;
case :
q[q[]-] *= q[q[]];
q[q[]-] %= mod;
break;
case :
q[q[]-] = power(q[q[]-], q[q[]]);
break;
case : p[]--; return;
case : p[]--; return;
}
p[]--, q[]--;
}
int get(char s[], int x) {
int i, j, k, len = strlen(s);
p[] = , q[] = , q[] = ;
for(i = ; i < len; i++) {
if(s[i] == ' ') continue;
if(s[i] == 'a') {
q[++q[]] = x;
continue;
}
if(isdigit(s[i])) {
q[++q[]] = s[i]-'';
while(isdigit(s[i+]))
q[q[]] = (q[q[]]* + s[++i]-'') % mod;
continue;
}
switch(s[i]) {
case '(': p[++p[]] = ; break;
case '+':
while(p[]> && p[p[]]> && p[p[]]<) work();
p[++p[]] = ; break;
case '-':
while(p[]> && p[p[]]> && p[p[]]<) work();
p[++p[]] = ; break;
case '*':
while(p[]> && p[p[]]> && p[p[]]<) work();
p[++p[]] = ; break;
case '^':
while(p[]> && p[p[]]> && p[p[]]<) work();
p[++p[]] = ; break;
case ')':
while(p[]> && p[p[]]<) work();
if(p[p[]] == ) p[]--; break;
}
}
while(p[]) work();
if(q[] == ) return (q[] + mod) % mod;
return (q[] + mod) % mod;
} int main() {
srand(time());
mod = rand() % + ;
int i, j, k, n;
gets(a);
for(i = ; i < max_len; i++)
x[i] = get(a, i);
scanf("%d\n", &n);
for(i = ; i < n; i++) {
gets(b);
for(j = ; j < max_len; j++)
if(get(b, j) != x[j]) break;
if(j >= max_len) printf("%c", 'A'+i);
}
return ;
}

洛谷 P1054 等价表达式的更多相关文章

  1. 洛谷 P1054 等价表达式 解题报告

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  2. 洛谷P1054 等价表达式

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  3. [NOIP2005] 提高组 洛谷P1054 等价表达式

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

  4. 洛谷 P1054 解题报告

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  5. 【数据结构】P1054 等价表达式

    [题目链接] https://www.luogu.org/problem/P1054 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数 ...

  6. P1054 等价表达式

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

  7. 洛谷 P7324 - [WC2021] 表达式求值(状压+dp)

    题面传送门 现场人傻系列-- 首先建出 \(E\) 的表达式树,具体来说表达式的每一个叶子节点表示一个数组 \(A_i\),每一个非叶子节点都表示一次运算,它的值表示左右儿子进行该运算后得到的结果.这 ...

  8. 洛谷 P1449 后缀表达式 Label:表达式计算系列

    题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应 ...

  9. 洛谷 P1449 后缀表达式

    题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应 ...

随机推荐

  1. 学password学一定得学程序

    题目描写叙述 以前.ZYJ同学非常喜欢password学.有一天,他发现了一个非常长非常长的字符串S1.他非常好奇那代表着什么,于是奇妙的WL给了他还有一个字符串S2.可是非常不幸的是,WL忘记跟他说 ...

  2. Inter-process Communication (IPC)

    For Developers‎ > ‎Design Documents‎ > ‎ Inter-process Communication (IPC) 目录 1 Overview 1.1 I ...

  3. Flex XML/XMLList 常用操作

    1       XML.XMLList操作 Flex对xml提供了很多强大而灵活的操作.相对于其他语言,flex对xml的格式要求不那么苛刻,只要符合基本格式语法的字符串,flex能非常简单的转换成x ...

  4. tar---打包,解压缩linux的文件和目录

    tar命令可以为linux的文件和目录创建档案.利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件.tar最初被用来在磁带上创建档案,现在,用户可以在 ...

  5. 测试理论--web测试方法总结

    一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数字.空或者空格.特殊字符“~!@#¥%……&*?[]{}”特别要注意单引号和&符号.禁止直接输入特殊字符时,使 ...

  6. 紫书 习题 10-32 UVa 1414 ( 迷之规律)

    看了其他人博客,貌似i个盘子的方案数满足 f[i] = f[i-1] * x + y ??????? 神来之笔 貌似没有找到严格的证明-- 牛逼-- 如果这样的话暴力求出x和y然后递推完事 #incl ...

  7. PHP抓取网页内容的几种方法

    方法1: 用file_get_contents 以get方式获取内容 <?php $url='http://www.domain.com/?para=123'; $html = file_get ...

  8. 【HDU】5249-KPI(线段树+离散化)

    好久没写线段树都不知道怎么写了... 很easy的线段树二分问题 #include<cstdio> #include<set> #include<queue> #i ...

  9. MongoDB + node-mongoskin简单演示样例

    特点 无模式 MongoDB 中的每一条文档,都是一个 JSON 对象,因此你无需提前定义一个集合的结构,集合中的每一个文档也能够有不同的结构. 异步写入 MongoDB 默认全部的写操作都是『不安全 ...

  10. Redisclient连接方式Hiredis简单封装使用,连接池、屏蔽连接细节

    工作须要对Hiredis进行了简单封装,实现功能: 1.API进行统一,对外仅仅提供一个接口. 2.屏蔽上层应用对连接的细节处理: 3.底层採用队列的方式保持连接池,保存连接会话. 4.重连时採用时间 ...