洛谷 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. 《R实战》读书笔记一

    你仅仅要想处理数据,<R实战>这本书就能够助你一臂之力. <R实战>的目标是让你认识R,而且可以对数据进行操作.可视化和理解.该书包含4部分16个章节8个附录. 第一部分:入门 ...

  2. modSecurity规则学习(七)——防止SQL注入

    1.数字型SQL注入 /opt/waf/owasp-modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [lin ...

  3. HDU 4372 Count the Buildings 组合数学

    题意:有n个点上可能有楼房,从前面可以看到x栋楼,从后面可以看到y栋,问楼的位置有多少种可能. 印象中好像做过这个题,

  4. 在performancepoint里面建立数据源的时候,总是发生以下的报警

    就是我在performancepoint里面建立数据源的时候,总是发生以下的报警.   在管理中心主页的“应用程序管理”部分,单击“管理服务应用程序”,然后单击“PerformancePoint Se ...

  5. 学习推荐《零起点Python大数据与量化交易》中文PDF+源代码

    学习量化交易推荐学习国内关于Python大数据与量化交易的原创图书<零起点Python大数据与量化交易>. 配合zwPython开发平台和zwQuant开源量化软件学习,是一套完整的大数据 ...

  6. IDEA 热启动,每次更改代码后不用重启服务

    1.ctrl+Shift+Alt+/,选择Registry 2.勾选 compiler.automake.allow.when.app.running(可能不按首字母排序,可以多找找) 3.Setti ...

  7. CodeForcesGym 100502E Opening Ceremony

    Opening Ceremony Time Limit: 5000ms Memory Limit: 524288KB This problem will be judged on CodeForces ...

  8. CSUOJ 1541 There is No Alternative

    There is No Alternative Time Limit: 3000ms Memory Limit: 262144KB This problem will be judged on Aiz ...

  9. sparkR处理Gb级数据集

    spark集群搭建及介绍:敬请关注 数据集:http://pan.baidu.com/s/1sjYN7lF 总结:使用sparkR进行数据分析建模相比R大致有3-5倍的提升 查看原始数据集:通过iri ...

  10. Floodlight中 处理packetin消息的顺序(2)

         前面通过阅读代码知道了怎样推断各个模块处理某个消息的先后顺序.那么内部是怎样实现的呢?      每当一个模块表示对一个消息感兴趣的时候,就会调用IFloodlightProviderSer ...