NOIP2005 等价表达式
题目描述
明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。 这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?
这个选择题中的每个表达式都满足下面的性质:
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…… 对于30%的数据,表达式中只可能出现两种运算符‘+’和‘-’; 对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。 对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。
输入
输入的第一行给出的是题干中的表达式。第二行是一个整数n(2 < = n < = 26),表示选项的个数。后面n行,每行包括一个选项中的表达式。这n个选项的标号分别是A,B,C,D…… 输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。
输出
输出包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。
样例输入
样例输出
/*
字符串处理,注意运算符顺序,注意int,long long 不要打反
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define ll long long
#define fo(i,l,r) for(int i = l;i <= r;i++)
#define fd(i,l,r) for(int i = r;i >= l;i--)
using namespace std;
const int maxn = ;
char s[][maxn];
bool vis[];
ll n,ans1,ans2,sed,mod;
ll read(){
ll x=,f=;
char ch=getchar();
while(!(ch>=''&&ch<='')){if(ch=='-')f=-;ch=getchar();};
while(ch>=''&&ch<=''){x=x*+(ch-'');ch=getchar();};
return x*f;
}
bool is_them(char a,char b,char c){
return (a == b || a== c);
}
ll q_mul(ll a,ll b,ll p){
ll ret = ;
while(b){
if(b&) ret = (ret + a) % p;
a = (a + a) % p;
b>>=;
}
return ret;
}
ll q_pow(ll a,ll b,ll p){
ll ret = ;
while(b){
if(b&) ret = q_mul(ret,a,p);
a = q_mul(a,a,p);
b>>=;
}
return ret;
}
ll str2int(char *s,int l,int r){
if(l==r&&s[l]=='a'){
return sed;
}
ll n = ;
for(int i=l;i<=r;i++){
if(s[i]>=''&&s[i]<='')
n=(n*+(s[i]-''))%mod;
else if(s[i]!=' ')
break;
}
return n;
}
ll calc(char *exp,int l,int r){
int lv=,p=-;
while(exp[l]==' '&&l<=r) l++;
while(exp[r]==' '&&l<=r) r--;
for(int i=l;i<=r;i++){
char &c = exp[i];
if(c==' ')continue;
if(c=='(')lv++;
if(c==')')lv--;
if(lv==){
if(is_them(c,'+','-'))
p=i;
else if(is_them(c,'*','/') && (p==-||!is_them(exp[p],'+','-')))
p=i;
else if(c=='^' && (p==- || exp[p] == '^')){
p=i;
}
}
}
if(lv < && exp[r] == ')') return calc(exp,l,r-);
else if(lv > && exp[r] == '(') return calc(exp,l+,r);
if(p==-){
if(exp[l]=='('&&exp[r]==')') return calc(exp,l+,r-);
if(exp[l]=='(') return calc(exp,l+,r);
if(exp[r]==')') return calc(exp,l,r-);
return str2int(exp,l,r);
}else{
ll a=calc(exp,l,p-);
ll b=calc(exp,p+,r);
switch(exp[p]){
case'+':return (a+b)%mod;
case'-':return (a-b+mod)%mod;
case'*':return (a*b)%mod;
case'/':return a/b;
case'^':return q_pow(a,b,mod);
};
}
return ;
}
bool tst(int id){
bool ok = false;
for(int i = ;i <= strlen(s[id]+);i++){
if(s[id][i] != ' ') ok = true;
}
return ok;
}
int main(){
cin.getline(s[]+,,'\n');
cin>>n;
for(int i = ;i <= n;i++){
cin.getline(s[i]+,,'\n');
while(!tst(i))cin.getline(s[i]+,,'\n');
}
sed = ;
mod = ;
ans1 = calc(s[],,strlen(s[]+));
for(int i = ;i <= n;i++){
ans2 = calc(s[i],,strlen(s[i]+));
if(ans2 == ans1) vis[i] = true;
}
sed = ;
mod = ;
ans1 = calc(s[],,strlen(s[]+));
for(int i = ;i <= n;i++){
ans2 = calc(s[i],,strlen(s[i]+));
if(ans2 == ans1) vis[i] = true;
}
for(int i = ;i <= n;i++){
char now = 'A'+i-;
if(vis[i]) cout<<now;
}
return ;
}
NOIP2005 等价表达式的更多相关文章
- NOIP2005 等价表达式 解题报告
明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和 ...
- 等价表达式(noip2005)
3.等价表达式 [问题描述] 兵兵班的同学都喜欢数学这一科目,中秋聚会这天,数学课代表给大家出了个有关代数表达式的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也 ...
- 数据结构--栈 codevs 1107 等价表达式
codevs 1107 等价表达式 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Descripti ...
- 洛谷 P1054 等价表达式 解题报告
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷P1054 等价表达式
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 等价表达式 2005年NOIP全国联赛提高组(栈模拟)
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷 P1054 等价表达式
洛谷 P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式, ...
- [NOIP2005] 提高组 洛谷P1054 等价表达式
题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数 ...
- 【b504】等价表达式(NOIP2005第4题)
Time Limit: 1 second Memory Limit: 50 MB [问题描述] 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数 ...
随机推荐
- Swift&Node 使用Alamofire进行Post
这篇博客主要实现Swift客户端和NodeJS后台的Post.Get请求实现. 我是一个略有点讨厌重复使用工具的人,比如这些基本功能完全可以用OC和PHP等替代,但是没办法,现在知识更新的太快啦,Sw ...
- 开发一个jQuery插件——多级联动菜单
引言 开发中,有好多地方用到联动菜单,以前每次遇到联动菜单的时候都去重新写,代码重用率很低,前几天又遇到联动菜单的问题,总结了下,发现可以开发一个联动菜单的功能,以后想用的时候就方便多了.项目中每个页 ...
- 数据结构与算法分析 - 网络流入门(Network Flow)
转载:网络流基础篇--Edmond-Karp算法 BY纳米黑客 网络流的相关定义: 源点:有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点. 汇点:另一个点也很特殊, ...
- hibernate----(Hql)另一种查询---利用Criteria类
package com.etc.test; import java.util.List; import org.hibernate.Criteria;import org.hibernate.Sess ...
- Linux环境下发布项目(Tomcat重新启动)
在Linux系统下,重启Tomcat 首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh 查看Tomcat是否 ...
- Java字节流与字符流基本操作
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据时要使用输入流读取数据,而当程序需要将一些数据保存起来时,就要使用输出流. 在java.io包中流的操作主要有字节流.字符流两大类,两类都 ...
- MySQL学习笔记——函数
常用函数 ALTER TABLE tb_emp ); #插入数据 INSERT INTO tb_dept() VALUE(,'市场部','负责市场工作'); # concat 连接 SELECT CO ...
- JSON-LD
RDF RDF用于信息需要被应用程序处理而不是仅仅显示给人观看的场合.RDF提供了一种用于表达这一信息.并使其能在应用程序间交换而不丧失语义的通用框架.既然是通用框架,应用程序设计者可以利用现成的通用 ...
- 在线考试系统(Online Exam System)--ASP.NET
用户设计 -|学生 -|老师 -|管理员 学生结构设计 -|个人信息管理 -|修改个人信息 -|修改登录密码 -|选课中心 -|显示所有老师所开课的信息可进行选课 -|显示自己已选课程 -|在线考试 ...
- Red Black Tree in C
http://web.mit.edu/~emin/www.old/source_code/red_black_tree/index.html