Description

你的任务是编写一个能处理在虚拟的化学里分子式的程序,具体地说,给定你所有原子的相对原子质量,求出所有询问的分子的相对分子质量,或者报告不存在。

数据范围:原子质量 \(\leqslant 1000\),分子式长度 \(\leqslant 80\),分子包含的原子个数 \(\leqslant 10^5\)。

Solution

这篇题解按照题面分 Part 来讲。

Part 1

如何将原子式和相对原子质量之间的关系映射出来?STL 里面有一个关联容器叫 map,可以处理本题中原子式和相对原子质量之间的对应关系。具体地,你可以将原子式为关键字,将相对原子质量作为这个关键字的值存储,这样就建立了这么个关系。

STL 里面还有个容器叫 vector,你可以把它看作是一个数组,但是它其实比数组还要高级,因为它的大小是动态的,而且同样也可以支持任何类型的存储。那么在这里说 vector 有什么用呢?我们在处理关系时,顺便将所有的原子式全部丢进 vector,以方便接下来的 Part 2 中判断分子式里面是否有不存在的原子式。

具体实现还请看代码。

Part 2

这也是这道题目最核心的部分了。

首先,如果没有括号的话,由于原子式只有可能是由一个大写字母或者一个大写字母 + 一个小写字母组成,所以就可以扫一遍过去,碰到大写字母判断大写字母后面判断是否有小写字母,有的话加上去。然后判断后面是否有数字,没有数字就默认按照一个来计算,否则提取出后面的数字并将这个数字乘上该元素的相对原子质量。

有括号改怎么办?这里就用到递归的思想了。我们碰到有括号的,先把括号里面的所有部分全部提取出来,然后判断后面是否有数字,没有数字就默认按照一个来计算,否则提取出后面的数字并将这个数字乘上该部分的相对原子质量总和。然后这个部分再进行一遍递归处理直到没有括号为止。

那么这道题目就做完了。

Code

namespace Solution {
string s; int x;
map<string, int> elements;
vector<string> elements_list; ii work(string s) {
int n = s.size(), i = 0, ans = 0;
while(i < n) {
if(s[i] == '(') {
stack<char> q;
q.push(s[i]), ++i;
string tmp = "";
while(1) {
if(s[i] == '(') q.push(s[i]);
else if(s[i] == ')') {
q.pop();
if(q.empty()) break;
}
tmp += s[i++];
}
i++;
int mul = 0;
if(!isdigit(s[i])) mul = 1;
else while(isdigit(s[i])) mul = mul * 10 + s[i] - '0', i++;
ans += work(tmp) * mul;
}
string element = "";
if(isupper(s[i])) {
element += s[i];
if(islower(s[i + 1])) i++, element += s[i];
int fl = 0;
F(int, j, 0, (int)elements_list.size() - 1) if(elements_list[j] == element) {fl = 1; break;}
if(!fl) return -1;
i++;
int mul = 0;
if(!isdigit(s[i])) mul = 1;
else while(isdigit(s[i])) mul = mul * 10 + s[i] - '0', i++;
ans += elements[element] * mul;
}
}
return ans;
} iv Main() {
while(1) {
cin >> s;
if(s == "END_OF_FIRST_PART") break;
read(x), elements[s] = x, elements_list.push_back(s);
}
while(1) {
cin >> s;
if(s == "0") break;
int ans = work(s);
if(ans == -1) puts("UNKNOWN");
else println(ans);
}
return;
}
}

LuoguP2382 化学分子式 题解的更多相关文章

  1. 题解 P2382 【化学分子式】

    题目 不懂为什么,本蒟蒻用在线算法打就一直炸...... 直到用了"半离线"算法...... 一遍就过了好吗...... 某位机房的小伙伴一遍就过了 另一位机房的小伙伴也是每次都爆 ...

  2. P2382 化学分子式

    luogu的oier化学一定都很好 这个题是让我们模拟计算化学方程式的过程. 和时间复杂度类似的题目. 我们可以根据括号,将求解分成若干个步骤. 从外部看,需要将一对括号看做一个整体.然后进行计算. ...

  3. .Net Request.Form含有危险字符的处理办法

    今天我们的网站遇到一个问题,下标就类似于化学分子式这样的是需要用"<sub></sub>"这个标签括起来的,当时没有转义,有部分标签就显示不出来了, 后来我 ...

  4. 软硬大比拼 硅胶、TPU和PC材质对比

    手机保护壳的材质有很多种,目前保护壳市场上最为常见的就是硅胶.TPU.PC材质了.那么我们不禁要问,PU.硅胶.PC三材质到底有哪些区别呢?普通消费者在购买保护壳的时候能否从外表就能看出保护壳材质?P ...

  5. 【LGR-048 五周年庆贺】洛谷6月月赛

    Luogu的五周年庆典比赛,还是比较满意的. 题目清新不毒瘤,数据优质不卡常,解法自然,为出题人点赞. 前三题的难度都很低,T5个人感觉还好.但是最后那个splay+hash是什么神仙东西. 最后好像 ...

  6. 【转】DSL

    DSL DSL 时不时地会成为一个话题,所以今天想专门说一下. DSL 也就是 Domain Specific Language 的简称,是指为某些特定领域(domain)设计的专用语言.举个例子,L ...

  7. NLP总览

    一.自然语言处理概述 1)自然语言处理:利用计算机为工具,对书面实行或者口头形式进行各种各样的处理和加工的技术,是研究人与人交际中以及人与计算机交际中的演员问题的一门学科,是人工智能的主要内容. 2) ...

  8. NLP知识十大结构

    NLP知识十大结构 2.1形式语言与自动机 语言:按照一定规律构成的句子或者字符串的有限或者无限的集合. 描述语言的三种途径: 穷举法 文法(产生式系统)描述 自动机 自然语言不是人为设计而是自然进化 ...

  9. SuperSubScriptHelper——Unicode上下标辅助类

    在项目的实施过程中,类似化学分子式.平方.立方等,需要处理上.下标字符. 上下标字符的实现,大致有两种方式,一种是字符本身包含上下标信息,另一种方式是通过格式化标记实现上下标字符的显示. Word中的 ...

随机推荐

  1. 链式调用Builder

    使用Lombok实现链式调用 1.静态调用 User对象: 对象中必须有一个值不为空staticname作为指定的参数并调用对象 @Accessors(chain = true) @Getter @S ...

  2. Codeforces 512E - Fox And Polygon(构造)

    Codeforces 题面传送门 & 洛谷题面传送门 中规中矩的构造题一道. 首先考虑将两张图都向一个中间状态转化.方便起见我们取所有点都连向 \(1\) 号点的情形作为中间状态. 考虑怎样从 ...

  3. 洛谷 P6499 - [COCI2016-2017#2] Burza(状压 dp)

    题面传送门 一道挺有意思的思维题(?) 首先我们假设根节点深度为 \(0\),那么 Daniel 的目标显然就是堵住一些节点使得 Stjepan 不能移动到深度为 \(k\) 的节点,Stjepan ...

  4. 认识Influxdb时序数据库及Influxdb基础命令操作

    认识Influxdb时序数据库及Influxdb基础命令操作 一.什么是Influxdb,什么又是时序数据库 Influxdb是一个用于存储时间序列,事件和指标的开源数据库,由Go语言编写而成,无需外 ...

  5. 小方法——匹配ip地址

    [root@MiWiFi-R1CM-srv ~]# ifconfig |sed -n '2p' inet addr:192.168.139.128 Bcast:192.168.139.255 Mask ...

  6. Linux-centos7设置静态IP地址

    参考:https://blog.csdn.net/sjhuangx/article/details/79618865

  7. mongodb-to-mongodb

    python3用于mongodb数据库之间倒数据,特别是分片和非分片之间. 本项目是一个集合一个集合的倒. 参考了logstash,对于只增不减而且不修改的数据的可以一直同步,阻塞同步,断点同步.改进 ...

  8. 工作学习1-tcp自连接

    运维同事反馈服务起不来.下面为了方便,写了一个demo来展示. https://gitee.com/northeast_coder/code/tree/master/case/case1_tcp_se ...

  9. idea 启动debug的时候throw new ClassNotFoundException(name)

    idea 启动debug的时候throw new ClassNotFoundException(name) 启动debug就跳转到此界面 解决办法 这个方法只是忽略了抛异常的点,并没有真正解决问题.后 ...

  10. acute

    In Euclidean geometry, an angle is the figure formed by two rays, called the sides of the angle, sha ...