题目名称 974. 化学反应
输入输出 chem.in/out
难度等级 ★★☆
时间限制 1000 ms (1 s)
内存限制 512 MiB
测试数据 9
题目来源 Gravatar王者自由 于2012-08-02加入
开放分组 全部用户
提交状态
分类标签
文法分析 字符串
分享题解
通过:1, 提交:1, 通过率:100%
GravatarOIdiot 100 0.006 s 0.44 MiB C++
关于 化学反应 的近10条评论(全部评论)
.........
GravatarHakurou!
2016-05-24 15:57 2楼
成功去吧!字符串!模拟起来!!!
GravatarOIdiot
2014-03-01 08:50 1楼

974. 化学反应

★★☆   输入文件:chem.in   输出文件:chem.out   简单对比
时间限制:1 s   内存限制:512 MiB

比尔是学校里的化学老师,他为学生们准备了一大堆测试题。每个测试有一个化学式子和几组反应产物,学生从中选择正确的一组。可是比尔并不确定他在输入计算机时是否打错了字,这样学生们就可以简单地判断等式左右两边物质是否守恒来看哪组正确了。

你需要写一个程序来帮助比尔。程序读入为学生们准备的测试,包含等式左边,一个表示选项数量的整数,若干个可能的等式右边。程序需要判断等式左右是否有相同相等的化学元素。

比尔为你这个不懂化学的计算机乡巴佬制定了一些规则来帮助你。等式两边都是不包含空格的字符串,包含若干个用 '+'(加号)隔开的化学物质。每个物质之前有一个可选的整系数表示物质数量。每个集团后有一个可选的整系数下标,集团可能只有一个元素或是用圆括号包住的几个元素。每个元素以一个大写字母和一个可选的小写字母表示。

详细规则用 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