题目描述

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

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

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 ;
}

最新文章

  1. W3School-CSS 尺寸 (Dimension) 实例
  2. selenium webdriver学习(一)
  3. Git分支操作
  4. 【转载】Linux i386+源码中常见宏标识tag的定义
  5. ext2文件系统
  6. 连接数据库超时设置autoReconnect=true
  7. java修改文件内容
  8. Appium webdriver的capabilities配置
  9. Codechef April Challenge 2019 Division 2
  10. Unable to resolve target &#39;android-XX&#39; 类似的错误。
  11. django中的modelform和modelfoemset
  12. Vim 安装 YouCompleteMe
  13. Python基础1(2017-07-16)
  14. Mybatis-PageHelper分页插件
  15. 合并两个sorted ranges(merge和inplace_merge)
  16. C# HmacSha512 与 java HmacSha512 加密
  17. 第6月第4天 AVMutableComposition AVMutableVideoComposition
  18. mybatis 对象关系映射例子
  19. 利用yacc和lex制作一个小的计算器
  20. echo图片延迟加载js

热门文章

  1. POJ 1840 Eqs
  2. js调用刷新
  3. squid节点添加新域名测试
  4. Maven异常:Could not find artifact
  5. 数据结构1 线段树查询一个区间的O(log N) 复杂度的证明
  6. AngularJs Cookies 操作
  7. [Eclipse]解决: Eclipse Maven “Add Dependency”搜索无结果
  8. JS生成随机数的各种函数
  9. IAR Usage
  10. 理解Docker单机容器网络