题目描述

  明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。    这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?

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

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个字符,而且保证选项中总有表达式和题干中的表达式是等价的。

输出

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

样例输入

(a+1)^2 3 (a-1)^2+4*a a+1+a a^2+2*a*1+1^2+10-10+a-a

样例输出

AC
/*
字符串处理,注意运算符顺序,注意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 等价表达式的更多相关文章

  1. NOIP2005 等价表达式 解题报告

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

  2. 等价表达式(noip2005)

    3.等价表达式 [问题描述]    兵兵班的同学都喜欢数学这一科目,中秋聚会这天,数学课代表给大家出了个有关代数表达式的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也 ...

  3. 数据结构--栈 codevs 1107 等价表达式

    codevs 1107 等价表达式 2005年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Descripti ...

  4. 洛谷 P1054 等价表达式 解题报告

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  5. 洛谷P1054 等价表达式

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  6. 等价表达式 2005年NOIP全国联赛提高组(栈模拟)

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  7. 洛谷 P1054 等价表达式

    洛谷 P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式, ...

  8. [NOIP2005] 提高组 洛谷P1054 等价表达式

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

  9. 【b504】等价表达式(NOIP2005第4题)

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数 ...

随机推荐

  1. TYVJ1982 武器分配

    描述     后勤部队运来一批武器(机枪和盔甲).你要把这些武器分配给手下的marine们(每人一部机枪,一套盔甲).可是问题来了...    这些武器的型号不相同(武器是由出价最低的承包商制造的), ...

  2. Akka: actor应用的一些小结

    1.消息: 1) case class是scala中一个不可变对象(当然你可以让他成为可变的),通过不可变对象来进行消息传递可以更加明确内容,也能保证线程安全 2) 在Java中如果你将class对象 ...

  3. Zabbix网络自动发现规则和自动添加hosts及link模板

    Version: zabbix 3.0 一.配置网络发现规则 Device uniqueness criteria:选择主机名作为唯一标识(Configuation Hosts中显示的NAME) 二. ...

  4. hihocoder 1347 小h的树上的朋友

    传送门 时间限制:18000ms单点时限:2000ms内存限制:512MB 描述 小h拥有$n$位朋友.每位朋友拥有一个数值$V_i$代表他与小h的亲密度.亲密度有可能发生变化.岁月流逝,小h的朋友们 ...

  5. Django TemplateSyntaxError Could not parse the remainder: '()'

    返回的数据是列表集合,如 n [5]: a = set() In [6]: a.add((1, 3)) In [7]: a Out[7]: {(1, 3)} 在模板中使用方式如下: {% for ar ...

  6. 解决 Ubuntu 无法调节屏幕亮度的问题(转)

    转http://blog.163.com/tym190@126/blog/static/8776005920143192412477/ 终端输入代码:     在打开文件中找到 GRUB_CMDLIN ...

  7. Python ValueError: IO operation on closed file

    ValueError IO operation on closed file表示处理了已经被关闭的数据,在python 中 with语句的上下文会帮助处理,也就是说,当python的处理代码不对齐的时 ...

  8. uC/OS-II标志(flag)块

    /*************************************************************************************************** ...

  9. WinForm------TreeList加载数据方法

    1.SQLService操作 (1)在SQLServer创建一张表dbo.Department (2)写入以下数据 2.VS操作(这里如何使用EntityFramework加载数据库就不多说了哈) ( ...

  10. WinForm------关于子窗体刷新父窗体问题

    链接: http://wenwen.sogou.com/z/q242758397.htm