P1054 等价表达式

题目描述

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

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

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

1. 表达式只可能包含一个变量‘a’。

2. 表达式中出现的数都是正整数,而且都小于10000。

3. 表达式中可以包括四种运算‘+’(加),‘-’(减),‘*’(乘),‘^’(乘幂),以及小括号‘(’,‘)’。小括号的优先级最高,其次是‘^’,然后是‘*’,最后是‘+’和‘-’。‘+’和‘-’的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符‘+’,‘-’,‘*’,‘^’以及小括号‘(’,‘)’都是英文字符)

4. 幂指数只可能是1到10之间的正整数(包括1和10)。

5. 表达式内部,头部或者尾部都可能有一些多余的空格。

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

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

输入输出格式

输入格式:

输入文件equal.in的第一行给出的是题干中的表达式。第二行是一个整数n(2 <= n <= 26),表示选项的个数。后面n行,每行包括一个选项中的表达式。这n个选项的标号分别是A,B,C,D……

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

输出格式:

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

输入输出样例

输入样例#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%的数据,表达式中只可能出现两种运算符‘+’和‘-’;

对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。

对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。

2005年提高组第四题

/*
给a 随机几个值,都可以的话等价的概率大一些
注意随时取模,别乘爆了。
其他就是栈模拟中缀表达式,挺恶心的。
读入都有坑,还要判断括号是否匹配。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack> #define ll long long
#define mod 1000007 using namespace std; ll pri[];
stack <ll> num,ope;
string map[],str;
ll n,ans[],len,i,j,k;
char c; inline void read()
{
c=getchar();
while(c=='\n' || c=='\r') c=getchar();
while(c!='\n' && c!='\r'){if(c!=' ') map[]+=c;c=getchar();}
scanf("%lld",&n);
for(i=;i<=n;i++)
{
while(c=='\n' || c=='\r') c=getchar();
while(c!='\n' && c!='\r'){if(c!=' ')map[i]+=c;c=getchar();}
}
} inline ll ksm(ll x,ll y)
{
if(y==) return x;
ll k=ksm(x,y/);
if(y & ) return (k*k*x)%mod;
return (k*k)%mod;
} void solve()
{
for(k=;k<=;k++)
{
while(!num.empty()) num.pop();
while(!ope.empty()) ope.pop();
for(i=;i<=len;i++)
{
if(str[i]=='a') num.push(k);
else if(str[i]>='' && str[i]<='')
{
ll tmp=;
while(str[i]>='' && str[i]<='')
tmp=tmp*+str[i]-'',i++;
num.push(tmp);
i--;
}
else if(str[i]==')')
{
bool flag=;
if(ope.empty()) break;
while(ope.top()!=(ll)'(')
{
c=ope.top();ope.pop();
ll num1=num.top();num.pop();
ll num2=num.top();num.pop();
if(c=='*') num.push((num2*num1)%mod);
if(c=='+') num.push((num2+num1)%mod);
if(c=='-') num.push((num2-num1)%mod);
if(c=='^') num.push(ksm(num2,num1));
if(ope.empty()) break;
}
if(ope.empty()) break;
ope.pop();
}
else if(ope.empty()) ope.push(str[i]);
else if(str[i]=='(') ope.push(str[i]);
else
{
c=ope.top();
if(c=='(')
{
ope.push(str[i]);
continue;
}
while()
{
if(ope.empty()) break;
c=ope.top();
if(pri[c]<pri[str[i]] || c=='(') break;
ope.pop();
ll num1=num.top();num.pop();
ll num2=num.top();num.pop();
if(c=='*') num.push((num2*num1)%mod);
if(c=='+') num.push((num2+num1)%mod);
if(c=='-') num.push((num2-num1)%mod);
if(c=='^') num.push(ksm(num2,num1));
}
ope.push(str[i]);
}
}
while(!ope.empty())
{
while()
{
if(ope.empty()) break;
c=ope.top();
if(c!=')') break;
ope.pop();
if(c==')' && ope.top()=='(') ope.pop();
else break;
}
if(ope.empty() || num.size()==) break;
ll num1=num.top();num.pop();
ll num2=num.top();num.pop();
c=ope.top();ope.pop();
if(c=='*') num.push((num2*num1)%mod);
if(c=='+') num.push((num2+num1)%mod);
if(c=='-') num.push((num2-num1)%mod);
if(c=='^') num.push( ksm(num2,num1));
}
int otk=num.top();
while(otk<) otk+=mod;
if(j && ans[k]!=otk) break;
if(j==)
{
ans[k]=num.top();
while(ans[k]<) ans[k]+=mod;
}
}
} int main()
{
pri['(']=pri[')']=;pri['^']=;
pri['*']=;pri['+']=pri['-']=;
read();
for(j=;j<=n;j++)
{
str=map[j];
len=str.size()-;
solve();
if(j && k==) printf("%c",j+'A'-);
}
printf("\n");
return ;
}

等价表达式 2005年NOIP全国联赛提高组(栈模拟)的更多相关文章

  1. 过河 2005年NOIP全国联赛提高组(离散化+dp)

    1105 过河 2005年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 在河上有一 ...

  2. Codevs 1105 过河 2005年NOIP全国联赛提高组

    1105 过河 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在河上有一座独木桥,一只青蛙 ...

  3. Vigenère密码 2012年NOIP全国联赛提高组(字符串模拟)

    P1079 Vigenère 密码 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简 ...

  4. Codevs 1200 同余方程 2012年NOIP全国联赛提高组

    1200 同余方程 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 求关于 x 同余方程 a ...

  5. Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组

    1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ...

  6. Codevs 1218 疫情控制 2012年NOIP全国联赛提高组

    1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...

  7. Codevs 3289 花匠 2013年NOIP全国联赛提高组

    3289 花匠 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 花匠栋栋种了一排花,每株花都 ...

  8. Codevs 1173 最优贸易 2009年NOIP全国联赛提高组

    1173 最优贸易 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description [问题描述] C 国有n ...

  9. Codevs 3731 寻找道路 2014年 NOIP全国联赛提高组

    3731 寻找道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找 ...

随机推荐

  1. Vue.Draggable实现拖拽效果(快速使用)

    1.下载包:npm install vuedraggable 配置:package.json "dependencies": { "element-ui": & ...

  2. [转] angular2+highcharts+chart.js

    这里是在ionic2下使用highchairs和chart.js的简单示例chartjs部分参考http://www.jianshu.com/p/bc18132da812 1.安装hightchart ...

  3. 【Lqb T336】Cowboys

    [链接] 我是链接,点我呀:) [题意] 出现AB就要交换一下 给你结果序列 问你原序列有多少种可能 首尾可以交换. [题解] 设 dp[i][0]表示i和i-1不交换,达到前i个字符序列的状态的方案 ...

  4. App后台开发运维和架构实践学习总结(4)——APP的注册和登录功能设计

    一.为什么需要注册和登录? 是否需要注册和登录的关键取决于产品形态. 如果用户注册登录对于用户需求.产品功能.商业模式本身带不来任何价值的话,就没必要设计这样的功能.比如一些实用工具类的产品:计算器. ...

  5. [luoguP1076] 寻宝(模拟)

    传送门 模拟就好! 然后需要把一圈的有楼梯的都记录一下,取膜乱搞. 代码 #include <cstdio> #include <iostream> #define N 100 ...

  6. noip模拟赛 whzzt-Conscience

    分析:数据中并不存在无解的情况...... 每个摄像头都要覆盖尽可能多的点,按照y从小到大排序.对于每一列,只用判断第一个没有被观测到的就可以了,这个点必须要放摄像头,因为除了它自己没有其它的摄像头能 ...

  7. 170611 NOIP模拟赛

    第一题没做出来不应该: 第二题不难想,就是写起来很麻烦: 第三题因为学了挺久的splay就直接写的splay,没太在意常数问题,一般情况下,第k值问题主席树是比splay稍快的: 盘子序列 [题目描述 ...

  8. Linux RAR 解压缩

    1.下载 http://www.rarlab.com/download.htm 2.安装 tar zxvf rarlinux-3.8.0.tar.gz cd rar make make install ...

  9. 20180725利用pmm监控管理mysql

    转自:https://www.percona.com/doc/percona-monitoring-and-management/architecture.html 报警机制https://www.p ...

  10. Canopy算法计算聚类的簇数

    Kmeans算是是聚类中的经典算法.步骤例如以下: 选择K个点作为初始质心 repeat 将每一个点指派到近期的质心,形成K个簇 又一次计算每一个簇的质心 until 簇不发生变化或达到最大迭代次数 ...