网站页面
当前课程
成员
General
主题 1
主题 2
主题 4
主题 5
主题 6
主题 7
主题 8
主题 9
主题 10
主题 11
主题 12
主题 13
主题 14
主题 15
主题 16
主题 17
主题 18
主题 19
主题 20
化学反应
成绩 | 0 | 开启时间 | 2013年02月21日 星期四 23:02 |
折扣 | 0.8 | 折扣时间 | 2013年02月28日 星期四 23:02 |
允许迟交 | 是 | 关闭时间 | 2013年02月28日 星期四 23:02 |
输入文件 | chem.in | 输出文件 | chem.out |
比尔是学校里的化学老师,他为学生们准备了一大堆测试题。每个测试有一个化学式子和几组反应产物,学生从中选择正确的一组。可是比尔并不确定他在输入计算机时是否打错了字,这样学生们就可以简单地判断等式左右两边物质是否守恒来看哪组正确了。
你需要写一个程序来帮助比尔。程序读入为学生们准备的测试,包含等式左边,一个表示选项数量的整数,若干个可能的等式右边。程序需要判断等式左右是否有相同相等的化学元素。
比尔为你这个不懂化学的计算机乡巴佬制定了一些规则来帮助你。等式两边都是不包含空格的字符串,包含若干个用 '+'(加号)隔开的化学物质。每个物质之前有一个可选的整系数表示物质数量。每个集团后有一个可选的整系数下标,集团可能只有一个元素或是用圆括号包住的几个元素。每个元素以一个大写字母和一个可选的小写字母表示。
详细规则用 BNF 图表示,如此:
- <式子> ::= [<数字>] <物质> { '+' [<数字>] <物质> }
- <物质> ::= <集团> [<数字>] { <集团> [<数字>] }
- <集团> ::= <元素> | '(' <物质> ')'
- <元素> ::= <大写字母> [ <小写字母> ]
- <大写字母> ::= 'A'..'Z'
- <小写字母> ::= 'a'..'z'
- <数字> ::= '1'..'9' { '0'..'9' }
设某种元素在式子中出现了 X 次,X 是该元素的系数与下标乘积之和。例如下面的化学式:
C2H5OH+3O2+3(SiO2)
- C 共出现了 2 次。
- H 共出现了 6 次 (5 + 1)。
- O 共出现了 13 次 (1 + 3*2 + 3*2)。
- Si 共出现了 3 次。
式子中所有系数都是整数,默认为 1 ,2 以上明示。每个式子中最多有 100 个字符,每种元素会出现不超过 10000 次。
输入
第一行包含一个化学式,即等式左边。第二行为一个整数 N (1 ≤ N ≤ 10),表示测试点数目。接下来 N 行每行描述一个测试点的等式右边。
输出
输出有 N 行,针对每个比尔的测试点给出答案。对于左右各个元素数量相等的测试点给出如下输出:
<等式左边>==<等式右边>
如果有元素数量不等,物质不守恒,则输出:
<等式左边>!=<等式右边>
这里<等式左边>必须是输入数据第一行的字符串,<等式右边>必须是完整的输入数据对应行的字符串。行中不允许有任何空白或其他什么东西出现。
样例输入
C2H5OH+3O2+3(SiO2) 6 2CO2+3H2O+3SiO2 2C+6H+13O+3Si 99C2H5OH+3SiO2 3SiO4+C2H5OH 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)==3(Si(O)2)+2CO+3H2O+O2 C2H5OH+3O2+3(SiO2)!=2CO+3H2O+3O2+3Si
提示
样例中并没有数字 '0',因为它看起来向化学元素氧的符号 'O'。实际测试点可能包含任何可能的字符。
来源
Northeastern Europe 2001 e, POJ 1114