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. 下一代的 3D Tiles 前瞻

    下一代的 3D Tiles 前瞻 原文:Introducing 3D Tiles Next, Streaming Geospatial to the Metaverse 原文发布时间:2021年11月 ...

  2. shell常用集锦

    该文整理一些常用的shell用法,及语法,并非介绍如何使用 变量 变量可分为两类:环境变量ENV(全局)和局部变量. bash环境变量 变量名 含义 _= 上一条命令的最后一个参数 BASH_VERS ...

  3. stat命令的实现-mysate(必做)

    学习使用stat(1),并用C语言实现 1. 提交学习stat(1)的截图 使用 man 1 stat 查看帮助手册 从图中可以看到stat的用法是display file or file syste ...

  4. MYSQL5.8----2

    一定要按照这个顺序,where group by having order by limit 可以进行一次排序之后再一次拍寻 #存储的时候,能存数字就村数字

  5. mysql-计算排名

    mysql计算排名,获取行号rowno 学生成绩表数据 SELECT * FROM table_score ORDER BY score DESC; 获取某个学生成绩排名并计算该学生和上一名学生成绩差 ...

  6. A Child's History of England.12

    Dunstan, Abbot of Glastonbury Abbey, was one of the most sagacious of these monks. He was an ingenio ...

  7. 『学了就忘』Linux启动引导与修复 — 69、启动引导程序(grub)

    目录 1.启动引导程序(Boot Loader)简介 2.启动引导程序grub的作用 3.启动引导程序grub的位置 4./grub目录中其他的文件简单介绍 提示: 简单地说,Boot Loader就 ...

  8. css相关,position定位详解

    CSS 有两个最重要的基本属性,前端开发必须掌握:display 和 position. display属性指定网页的布局.两个重要的布局,弹性布局flex和网格布局grid. 本文介绍非常有用的po ...

  9. HTTP初识

    HTTP(HyperText Transfer Protocol):超文本传输协议. URL(Uniform Resource Locator):统一资源定位符. URI(Uniform Resour ...

  10. 100个Shell脚本——【脚本4】自定义rm命令

    [脚本4]自定义rm命令 linux系统的rm命令太危险,一不小心就会删除掉系统文件. 写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份,然后再删除.下面分两种情 ...