#P1114. Chemical Reactions
Chemical Reactions
本题没有可用的提交语言。
描述
比尔在学校教授化学课程,并且为他的学生准备了一系列的测试题。每道测试题都包含一个化学方程式,以及若干个可能的反应产物,学生需要从中选择一个正确的。然而,比尔想要确保自己在将测试题录入电脑时没有出现任何拼写错误,同时也确保学生不会仅仅通过计算方程式两边化学元素的数量(在一个有效的反应中,两边化学元素的数量应该始终相等)就轻易排除错误答案。
你需要编写一个程序来帮助比尔。该程序需要读取为学生准备的测试题描述,包括给定的方程式左边部分,以及若干个可能的右边部分,并判断每个方程式右边部分的化学元素数量是否与给定的左边部分的化学元素数量相等。
为了帮助你们这些对复杂化学世界不太了解的可怜的计算机从业人员,比尔将任务进行了形式化处理。方程式的每一边都由一个不含空格的字符串表示,并且由一个或多个化学序列组成,这些序列之间用“+”(加号)字符分隔。每个序列都有一个可选的前置整数乘数,该乘数适用于整个序列,并且包含若干个元素。每个元素后面都可以跟一个可选的整数乘数,该乘数适用于该元素。在这个方程式中,一个元素可以是不同的化学元素,也可以是一个用圆括号括起来的整个序列。每一个不同的化学元素都用一个大写字母,或者一个大写字母后跟一个小写字母来表示。
更形式化地说,使用类似于巴科斯 - 诺尔范式(BNF)的表示法,我们可以写成:
� ::= [] { '+' [] }
� ::= [] { [] }
� ::= | '(' ')'
� ::= [ ]
� ::= 'A'..'Z'
� ::= 'a'..'z'
� ::= '1'..'9' { '0'..'9' }
如果 (X) 是某个特定化学元素所有单独出现的次数乘以所有适用于它的数字的总和,那么就说这个不同的化学元素在给定的化学式中总共出现了 (X) 次。例如,在下面这个化学方程式中:
C2H5OH+3O2+3(SiO2)
- C 总共出现了 次。
- H 总共出现了 次( + )。
- O 总共出现了 次( + + )。
- Si 总共出现了 次。
方程式中的所有乘数都是整数,如果明确指定则至少为 2,默认值为 1。每个化学方程式最长为 100 个字符,并且保证每个不同的化学元素在每个方程式中总共出现的次数不超过 10000 次。
输入
输入文件的第一行表示要测试的作为方程式左边部分的化学方程式。输入文件的第二行包含一个整数 (),它是要测试的方程式右边部分的数量。接下来的 行中的每一行都表示一个这样的方程式右边部分。
输出
你需要向输出文件写入 (N) 行内容,输入文件中为比尔的学生提供的每一个可能的化学测试答案对应一行。对于在输入文件中遇到的每一个右边部分的方程式,向输出文件写入:
- 如果方程式左边部分每个不同化学元素的总出现次数等于右边部分该化学元素的总出现次数,则写入:
< left_formula >==< right_formula >
- 否则写入:
< left_formula >!=< right_formula >
这里 < left_formula >
必须逐字(字符对字符)替换为输入文件第一行中给出的原始左边部分的方程式,< right_formula >
必须逐字替换为输入文件中给出的每一个右边部分的方程式。在写入输出文件的行中不要添加任何空格。
输入示例
C2H5OH+3O2+3(SiO2)
7
2CO2+3H2O+3SiO2
2C+6H+13O+3Si
99C2H5OH+3SiO2
3SiO4+C2H5OH
C2H5OH+3O2+3(SiO2)+Ge
3(Si(O)2)+2CO+3H2O+O2
2CO+3H2O+3O2+3Si
输出示例
C2H5OH+3O2+3(SiO2)==2CO2+3H2O+3SiO2
C2H5OH+3O2+3(SiO2)==2C+6H+13O+3Si
C2H5OH+3O2+3(SiO2)!=99C2H5OH+3SiO2
C2H5OH+3O2+3(SiO2)==3SiO4+C2H5OH
C2H5OH+3O2+3(SiO2)!=C2H5OH+3O2+3(SiO2)+Ge
C2H5OH+3O2+3(SiO2)==3(Si(O)2)+2CO+3H2O+O2
C2H5OH+3O2+3(SiO2)!=2CO+3H2O+3O2+3Si
来源
2001年东北欧地区竞赛