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 [问题描述] 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数 ...
随机推荐
- centos安装163源
cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.cp wget http://mirrors.163.com/.help/CentO ...
- python json.dumps() json.dump()的区别
以前写的很简单,只有几句话,最近发现本文是本博客阅读量最大的一篇文章,觉得这样有种把人骗进来的感觉,于是又细化了一些.如果还有不好的地方,欢迎指出. 首先说明基本功能: dumps是将dict转化成s ...
- Beta版本——第五次冲刺博客
我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...
- 整理CSS引发的相关理论的梳理
写在前面 因为原先项目中的CSS样式乱得不行,所以领导决定要花大时间整理一下样式,也为了后续维护起来方便.其实也苦了自己,想想也是一件多烦的事情,烦的原因并非是说这件事情做起来没有意义,而是觉得这样的 ...
- Docker入门教程(三)Dockerfile
Docker入门教程(三)Dockerfile [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOn ...
- BZOJ2960: 跨平面
从一条边出发遍历,每次找旋转角度最小的一条边作为下一条边,直到回到出发的边,就得到了一个区域.这样建出对偶图后跑不定根的最小树形图就行了. #include<bits/stdc++.h> ...
- MySQL下全文索引
一种特殊的索引,它会把某个数据表的某个数据列出现过的所有单词生成一份清单. alter table tablename add fulltext(column1,column2) 只能在MyISAM数 ...
- win7下exe提示无法正常启动(0xc0000906)
本人遇见是 avast问题,卸了
- RandomAccessFile类
File类只是针对文件本身进行操作,而如果要对文件内容进行操作,则可以使用RandomAccessFile类,此类属于随机读取类,可以随机地读取一个文件中指定位置的数据. //============ ...
- JavaScript学习笔记——BOM_window对象
javascript浏览器对象模型-windwo对象 BOM Browser Object Model window对象 是BOM中所有对象的核心. 一.属性 1.(位置类型-获得浏览器的位置) IE ...