洛谷 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个字符,而且保证选项中总有表达式和题干中的表达式是等价的。
输出格式:
一行,包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。
输入输出样例
说明
对于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 等价表达式的更多相关文章
- 洛谷 P1054 等价表达式 解题报告
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷P1054 等价表达式
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- [NOIP2005] 提高组 洛谷P1054 等价表达式
题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数 ...
- 洛谷 P1054 解题报告
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 【数据结构】P1054 等价表达式
[题目链接] https://www.luogu.org/problem/P1054 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数 ...
- P1054 等价表达式
题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数 ...
- 洛谷 P7324 - [WC2021] 表达式求值(状压+dp)
题面传送门 现场人傻系列-- 首先建出 \(E\) 的表达式树,具体来说表达式的每一个叶子节点表示一个数组 \(A_i\),每一个非叶子节点都表示一次运算,它的值表示左右儿子进行该运算后得到的结果.这 ...
- 洛谷 P1449 后缀表达式 Label:表达式计算系列
题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应 ...
- 洛谷 P1449 后缀表达式
题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应 ...
随机推荐
- 13.ng-value
转自:https://www.cnblogs.com/best/tag/Angular/ 绑定给定的表达式到input[select]或 input[radio]的值上 <input type= ...
- Function的一些结论与eval函数.
1.1 函数的创建方式 1 函数声明 2 函数表达式 3 new Function // 1 function foo() {} // 2 var foo = function() {}; // 3 ...
- 将本地的代码上传到网上SVN库
使用VisualSVN Server创建版本库: https://jingyan.baidu.com/article/db55b609f6aa724ba20a2f6c.html 最详细的教程: htt ...
- 使用sh库执行shell命令
python中执行shell命令 之前执行shell命令多是通过os.system(shell命令)的方式来执行,比较麻烦. 了解到sh是一个比subprocess好的库,能够执行shell命令 1. ...
- BZOJ2137: submultiple(生成函数,二项式定理)
Description 设函数g(N)表示N的约数个数.现在给出一个数M,求出所有M的约数x的g(x)的K次方和. Input 第一行输入N,K.N表示M由前N小的素数组成.接下来N行,第i+1行有一 ...
- AtCoderAGC003D Anticube
Description: 给定一个序列\(a\),要求选出最多的序列元素并保证两两元素的乘积不为立方数 Solution: 我们考虑哪些因子是有用的,如果一个因子的指数\(>3\),我们可以将他 ...
- 【Docker构建私有仓库】
Docker默认不允许非HTTPS方式推送镜像,我们可以通过Docker的配置选项来取消此限制: [root@fedora ~]# cat /etc/docker/daemon.json { &quo ...
- file---探测给定文件的类型
file命令用来探测给定文件的类型.file命令对文件的检查分为文件系统.魔法幻数检查和语言检查3个过程. 语法 file(选项)(参数) 选项 -b:列出辨识结果时,不显示文件名称: -c:详细显示 ...
- MongoDB + node-mongoskin简单演示样例
特点 无模式 MongoDB 中的每一条文档,都是一个 JSON 对象,因此你无需提前定义一个集合的结构,集合中的每一个文档也能够有不同的结构. 异步写入 MongoDB 默认全部的写操作都是『不安全 ...
- 动态游标(比如表名作为參数)以及动态SQL分析
表名作为參数的动态游标 DECLARE v_table_name VARCHAR2(30) := 'CUX_MES_WIP_BARCODE_MAP'; --l_rec SYS_REFCURSOR; T ...