等价表达式
描述
明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。
这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?
这个选择题中的每个表达式都满足下面的性质:
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个字符,而且保证选项中总有表达式和题干中的表达式是等价的。
输出格式
输出包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。
样例1
样例输入1
( a + 1) ^2
3
(a-1)^2+4*a
a + 1+ a
a^2 + 2 * a * 1 + 1^2 + 10 -10 +a -a
样例输出1
AC
限制
1s
来源
NOIp2005 第四题
中缀表达式转成后缀表达式,随机带几个a的值,判断是否相等
因为有幂运算,还要找个素数mod一下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 #define inf 1000000000 3 #define maxn 10000+5 4 #define maxm 50000+5 5 #define eps 1e-10 6 #define ll long long 7 #define mod 5000011 8 #define for0(i,n) for(int i=0;i<(n);i++) 9 #define for1(i,n) for(int i=1;i<=(n);i++) 10 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 11 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 12 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 13 using namespace std; 14 int read(){ 15 int x=0,f=1;char ch=getchar(); 16 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 17 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 char a[maxn]; 21 int num,n; 22 int s1[maxn]; 23 char s2[maxn]; 24 int lena; 25 int ans1,ans2; 26 bool cmp(char a,char b){ 27 if(b=='`'||b=='(')return 0; 28 else{ 29 if(a=='+'||a=='-')return 1; 30 if(a=='*'){ 31 if(b=='^')return 1; 32 else return 0; 33 } 34 else return 0; 35 } 36 } 37 int work(int a,char b,int c){ 38 if(b=='+')return (a+c)%mod; 39 if(b=='-')return (a-c+mod)%mod; 40 if(b=='*')return (a*c)%mod; 41 ll tmp=a; 42 for1(i,c-1) 43 tmp=(tmp*a)%mod; 44 return (int)tmp; 45 } 46 int main(){ 47 //freopen("input.txt","r",stdin); 48 //freopen("output.txt","w",stdout); 49 gets(a); 50 lena=strlen(a); 51 int head=0,tail=0; 52 while(tail<lena){ 53 if(a[tail]!=' ')a[head++]=a[tail]; 54 tail++; 55 } 56 lena=head; 57 int l=0,now=0,now2=0; 58 s2[now2]='`'; 59 while(l<lena){ 60 int tmp=0,flag=0; 61 while(a[l]>='0'&&a[l]<='9'){ 62 tmp=tmp*10+a[l]-'0'; 63 l++; 64 flag=1; 65 } 66 if(!flag&&a[l]=='a'){ 67 l++;tmp=231;flag=1; 68 } 69 if(!flag){ 70 if(a[l]=='(')s2[++now2]=a[l++]; 71 else if(a[l]==')'){ 72 while(s2[now2]!='('){ 73 int tmp1=work(s1[now-1],s2[now2],s1[now]); 74 now--;now2--; 75 s1[now]=tmp1; 76 } 77 now2--;l++; 78 } 79 else{ 80 while(cmp(a[l],s2[now2])){ 81 int tmp1=work(s1[now-1],s2[now2],s1[now]); 82 now--;now2--; 83 s1[now]=tmp1; 84 } 85 s2[++now2]=a[l++]; 86 } 87 } 88 else s1[++now]=tmp; 89 } 90 while(s2[now2]!='`'){ 91 int tmp1=work(s1[now-1],s2[now2],s1[now]); 92 now--;now2--; 93 s1[now]=tmp1; 94 } 95 ans1=s1[now]%mod;; 96 n=read(); 97 for1(i,n){ 98 gets(a); 99 lena=strlen(a); 100 tail=0;head=0; 101 while(tail<lena){ 102 if(a[tail]!=' ')a[head++]=a[tail]; 103 tail++; 104 } 105 lena=head; 106 l=0,now=0,now2=0; 107 s2[now2]='`'; 108 while(l<lena){ 109 int tmp=0,flag=0; 110 while(a[l]>='0'&&a[l]<='9'){ 111 tmp=tmp*10+a[l]-'0'; 112 l++; 113 flag=1; 114 } 115 if(!flag&&a[l]=='a'){ 116 l++;tmp=231;flag=1; 117 } 118 if(!flag){ 119 if(a[l]=='(')s2[++now2]=a[l++]; 120 else if(a[l]==')'){ 121 while(s2[now2]!='('){ 122 int tmp1=work(s1[now-1],s2[now2],s1[now]); 123 now--;now2--; 124 s1[now]=tmp1; 125 } 126 now2--;l++; 127 } 128 else{ 129 while(cmp(a[l],s2[now2])){ 130 int tmp1=work(s1[now-1],s2[now2],s1[now]); 131 now--;now2--; 132 s1[now]=tmp1; 133 } 134 s2[++now2]=a[l++]; 135 } 136 } 137 else s1[++now]=tmp; 138 } 139 while(s2[now2]!='`'){ 140 int tmp1=work(s1[now-1],s2[now2],s1[now]); 141 now--;now2--; 142 s1[now]=tmp1; 143 } 144 s1[now]%=mod; 145 if(s1[now]==ans1) 146 printf("%c",(char)('A'+i-1)); 147 } 148 return 0; 149 } 150 //+ - > * / > ^