#P3011. 「NOIP2005」等价表达式

「NOIP2005」等价表达式

Description

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

这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?

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

  1. 表达式只可能包含一个变量 ‘aa’ 。

  2. 表达式中出现的数都是正整数,而且都小于 10,00010,000

  3. 表达式中可以包括四种运算 ‘++’ (加), ‘-’ (减), ‘*’ (乘), ‘^’ (乘幂),以及小括号 ‘((’ , ‘))’ 。小括号的优先级最高,其次是 ‘^’ ,然后是 ‘*’ ,最后是 ‘++’ 和 ‘-’ 。 ‘++’ 和 ‘-’ 的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符 ‘++’ , ‘-’ , ‘*’ , ‘^ ’以及小括号 ‘((’ , ‘))’ 都是英文字符)

  4. 幂指数只可能是 111010 之间的正整数(包括 111010 )。

  5. 表达式内部,头部或者尾部都可能有一些多余的空格。

下面是一些合理的表达式的例子:

((a((a ^ 1)1 ) ^ 2)2 ) ^ 33aa+aaa*a+a-a

((a+a))((a+a))9999+(aa)a9999+(a-a)*a

1+(a1)1 + (a -1) ^ 33

11 ^ 1010 ^ 99 ……

Input Format

输入文件 equal.inequal.in 的第一行给出的是题干中的表达式。

第二行是一个整数 nn ,表示选项的个数。

后面 nn 行,每行包括一个选项中的表达式。这 nn 个选项的标号分别是 ABCDA,B,C,D……

Output Format

输出文件 equal.outequal.out 包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。

选项的标号按照字母顺序排列,而且之间没有空格。

Sample

equal.in

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

equal.out

AC

Hint

对于30%30\% 的数据,表达式中只可能出现两种运算符 ‘++’ 和 ‘-’ ;

对于其它的数据,四种运算符 ‘++’ , ‘-’ , ‘*’ , ‘^’ 在表达式中都可能出现。

对于100%100\% 的数据,2n262\leq n \leq 26,表达式中都可能出现小括号 ‘((’ 和 ‘))’ 。