CH BR4思考熊(恒等有理式-逆波兰表达式求值)
恒等有理式
| 总时限 | 10s | 内存限制 | 256MB |
|---|---|---|---|
| 出题人 | fotile96 | 提交情况 | 4/43 |
描述
给定两个有理式f(X)与g(X),判断他们是否恒等(任意A,如果f(A)与g(A)均有定义,那么f(A)=g(A))。
有理式通过他们的中缀表达式给出,为了简化问题,我们对给出的中缀表达式进行如下的规范:
- 该表达式仅包含a-z0-9.+-*/^(),其中a-z用来表示未知数,0-9.用来表示数字常量,+-*/^是运算符,()用来改变运算顺序;
- 所有的运算符(+-*/^)都只作二元运算符使用,包括-;(即是说,-不被当作表示负数的单目运算符使用)
- 所有的运算符(+-*/^)都是左结合的,包括^;(即是说,^不是右结合的。x^a^b应当作(x^a)^b计算而不是x^(a^b))
- 表达式中的所有数字常量都是无符号的整数或者小数,即是说,是非空整数串或由.隔开的两个非空整数串,数字常量可能有前导零;
- 由于给出的是有理式,保证^的第二个运算数是自然数常量;
- 表达式中的未知数由小写字母a-z表示。
例如,下列的表达式在该规范下是合法的:
- x^2+2*x+1
- 1/(x+1)^2/(y+1)^2
而下面这些是不合法的:
- -x^2-2*x-1
- x^(4+5)
- x^(0-1)
他们在这个约定下的可能的合法表示是:
- 0-x^2-2*x-1
- x^9
- 1/x
输入格式
第一行,一个整数T,表示测试数据的组数。
接下来有T组数据,每组数据包含两行,每行给出了一个规范的有理式。
输出格式
对于每组数据输出一行,这行内的内容应当是"YES"或"NO"(不含引号),表示该组数据内的两个有理式恒等或是不等。
样例输入
4
(a+b)^2
a^2+2*a*b+b^2
1/x-1/y
(y-x)/(x*y)
x
x+0.00000000000001
0.0000000001*0.00000000001*x
(1/10)^21*x
样例输出
YES
YES
NO
YES
数据范围与约定
共10个测试点,每个测试点10分。每个测试点的总字符个数不超过6*10^5。另外,各个测试点满足:
- 第1-3号测试点中不含小写英文字母
- 第4-6号测试点,每个测试点总字符数不超过1000
- 第7-10号测试点没有类似前两种数据的限制
完全不会做……
只好随便带数字进去骗……(不会……我X)
不想说什么了……(现学现卖:逆波兰表达式求值)
考虑到程序写得很清楚,不写过程了
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
#include<cassert>
#include<climits>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define INF (2139062143)
#define MAXN (600000+10)
typedef long long ll;
ll Fp[10]={1002347903,1000000411,1000000033,1000000087,1000000009};int p_size=5;
ll F=(1002347903);
int T,sp=0,opt[1000]={0},n;
ll val[1000]={0};
char buf[MAXN],st[MAXN];
ll num[MAXN];
ll pow2(ll a,ll b)
{
if (b==0) return 1;
if (b==1) return a%F;
ll c=pow2(a,b/2);
c=c*c%F;
if (b&1) c=c*a%F;
return c;
}
ll mulinv(ll a)
{
return pow2(a,F-2);
}
ll revF=mulinv(10);
ll getint(int &i)
{
if (st[sp]=='^') F--;//revF=mulinv(10); if (isalpha(buf[i])) return val[buf[i]];
ll xm=0,xr=1;
for(;isdigit(buf[i])&&i<=n;i++)
{
xm=(xm*10+(buf[i]-48))%F;
}
if (buf[i]=='.')
{
i++;
for(;isdigit(buf[i])&&i<=n;i++)
{
xm=(xm*10+(buf[i]-48))%F;xr=xr*revF%F;
}
}
i--; if (st[sp]=='^') F++;//revF=mulinv(10); return xm*xr%F;
}
void calc()
{
if (st[sp]=='+') num[sp]=(num[sp]+num[sp+1])%F;
else if (st[sp]=='-') num[sp]=(num[sp]-num[sp+1]+F)%F;
else if (st[sp]=='*') num[sp]=(num[sp]*num[sp+1])%F;
else if (st[sp]=='/') num[sp]=(num[sp]*mulinv(num[sp+1]))%F;
else if (st[sp]=='^') num[sp]=(pow2(num[sp],num[sp+1]))%F;
sp--;
}
void print()
{
if (T>=0) return;
//#ifdef DEBUG
For(j,sp+1) cout<<num[j]<<' ';cout<<endl;
For(j,sp) cout<<st[j]<<' ';cout<<endl;
cout<<"sp="<<sp<<endl;
//#endif
}
long long work()
{
n=strlen(buf+1);sp=0;
For(i,n)
{
// cout<<i<<':'<<endl;
int t=opt[buf[i]];
if (t>0)
{
while (opt[st[sp]]>=t) calc();
st[++sp]=buf[i];
}
else if (buf[i]=='(') st[++sp]=buf[i];
else if (buf[i]==')')
{
while (st[sp]!='(') calc();
num[sp]=num[sp+1];sp--;
}
else num[sp+1]=getint(i);
///-0000
print();
}
while (sp) calc(),print();
// cout<<"=================================================\n";
return num[1];
}
ll ans[10][2];
int main()
{
// freopen("expression.in","r",stdin);
// freopen(".out","w",stdout);
scanf("%d",&T);
// cout<<pow2(10,4);
// For(i,1000) cout<<pow2(10,i)<<' ';
/*
srand(32987);val['a']=1000000007;val['a']=1023492132;
For(i,25) val[i+'a']=(rand()*+rand()*10003+val[i+'a'-1])%F;
*/ srand('o'+'r'+'z');
For(i,26) val[i+'a'-1]=F-rand()%(F/100)-F/100*(i-1); // val['a']=1;val['b']=7;
opt['+']=opt['-']=1,opt['*']=opt['/']=2,opt['^']=3,opt['(']=opt[')']=-1;
while (T--)
{
Rep(j,2)
{
scanf("%s",buf+1);
Rep(i,5)
{
F=Fp[i];revF=mulinv(10);
ans[i][j]=work();
}
}
//cout<<ans[0][0]<<' '<<ans[0][1]<<endl;
bool bo=1;
Rep(i,5) if (ans[i][0]^ans[i][1]) {puts("NO");bo=0;break;}
if (bo) puts("YES");
}
return 0;
}
CH BR4思考熊(恒等有理式-逆波兰表达式求值)的更多相关文章
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...
- SDIBT2666——逆波兰表达式求值
逆波兰表达式求值(栈和队列) Description 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序.规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+ ...
- LeetCode:逆波兰表达式求值【150】
LeetCode:逆波兰表达式求值[150] 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除 ...
- Leetcode 150.逆波兰表达式求值
逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总 ...
- leetcode算法学习----逆波兰表达式求值(后缀表达式)
下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目: 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...
- LeetCode 150. 逆波兰表达式求值(Evaluate Reverse Polish Notation) 24
150. 逆波兰表达式求值 150. Evaluate Reverse Polish Notation 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, /.每个运算对象 ...
- Java实现 LeetCode 150 逆波兰表达式求值
150. 逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波 ...
- LeetCode150 逆波兰表达式求值
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
- 【python】Leetcode每日一题-逆波兰表达式求值
[python]Leetcode每日一题-逆波兰表达式求值 [题目描述] 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说 ...
随机推荐
- 14.18.1 The InnoDB Recovery Process InnoDB 恢复进程:
14.18.1 The InnoDB Recovery Process InnoDB 恢复进程: InnoDB crash recovery 有几个步骤组成: 1.应用redo log,Redo lo ...
- Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码
主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码: #include <stdio.h> #include <sys/types. ...
- hdu1087Super Jumping! Jumping! Jumping!(最大递增序列和)
题意:棋牌游戏如今,一种被称为“超级跳!跳!跳!“HDU是非常流行的.也许你是个好孩子,这个游戏知之甚少,所以我介绍给你吧. 可以玩游戏由两个或两个以上的球员 .它由一个棋盘(棋盘)和一些棋子(棋子) ...
- 浅谈C#中的泛型
1.什么是泛型? 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写 代码时定义一些可变部分,那些部分在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将 ...
- 关于SIGSLOT的一个简单的程序
废话少说直接看代码即可,这只是一个简单的程序,可以帮我们简单地明白SIGSLOT是怎么回事.至于深入研究自己去百度吧. #include "sigslot.h" using nam ...
- Js三级联动菜单
效果演示: <SCRIPT LANGUAGE="JavaScript"> <!-- function CreateSelect(_FormName,_SName, ...
- SAP自带的创建报表工具
SAP自带的工具有quickview和query两个主要的工具,当然还有其他的 quickview和query的区别主要是query支持系统之间的传输,quickview只能是用户的客户端创建使用,不 ...
- 与众不同 windows phone (11) - Background Task(后台任务)之警报(Alarm)和提醒(Reminder)
原文:与众不同 windows phone (11) - Background Task(后台任务)之警报(Alarm)和提醒(Reminder) [索引页][源码下载] 与众不同 windows p ...
- 可运行jar包调用exe可运行文件,子进程阻塞
背景: 须要在项目的測试工具中加入一个button,点击后直接打开某exe工具. 这个工具的功能是导入txt文件,转为excel报表输出. 无奈解析了两行之后就停止不动了,也不报错.关闭測试工具后,就 ...
- Android学习4、Android该Adapter
一.Adapter介绍 An Adapter object acts as a bridge between an AdapterView and the underlying data for th ...