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. Redis | 第一部分:数据结构与对象 下篇《Redis设计与实现》

    目录 前言 1. Redis对象概述 1.1 对象的定义 2. 字符串对象 3. 列表对象 3.1 quicklist 快速链表 4. 哈希对象 5. 集合对象 6. 有序集合对象 7. Redis对 ...

  2. 解决texlive化学式转换镜像经常偶发性进程堆积导致卡顿问题

    前言 之前在 使用Python定时清理运行超时的pdflatex僵尸进程 博文中我采用python脚本开启定时任务清理pdflatex僵尸进程,线上4u2G的k8s pod部署了3个,pdflatex ...

  3. Codeforces 566C - Logistical Questions(点分治)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题 %%% 首先考虑对这个奇奇怪怪的 \(t^{3/2}\) 进行一番观察.考虑构造函数 \(f(x)=ax^{3/2}+b(d-x) ...

  4. python第三天 列表和元组

    枚举 for in enumerate 循环输出字符串的内容并且输出它的索引信息: #判断索引为5的字符串是不是"您" is in Python提供了⼤量的内置数据结构,包含了列表 ...

  5. tensorboard 拒绝连接无法打开相应页面

    启动tensorboard时没有报错,但打开页面却拒绝连接. 解决方法:tensorboard --logdir=TEC4FN --host=127.0.0.1 在命令最后添加 --host=127. ...

  6. 大数据学习day32-----spark12-----1. sparkstreaming(1.1简介,1.2 sparkstreaming入门程序(统计单词个数,updateStageByKey的用法,1.3 SparkStreaming整合Kafka,1.4 SparkStreaming获取KafkaRDD的偏移量,并将偏移量写入kafka中)

    1. Spark Streaming 1.1 简介(来源:spark官网介绍) Spark Streaming是Spark Core API的扩展,其是支持可伸缩.高吞吐量.容错的实时数据流处理.Sp ...

  7. celery开启worker报错django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE o

    其实挺简单的问题,但花了自己一个下午来解决,先是浏览各种博客,无果:没办法,然后去看celery官方文档,无果,近乎绝望,最后仔细看代码,找到问题所在(如下),自学狗这效率...... 下面是自己ta ...

  8. Swagger2异常 java.lang.NumberFormatException: For input string: ""

    问题在访问swagger首页时报错: java.lang.NumberFormatException: For input string: "" at java.lang.Numb ...

  9. GO并发相关

    锁的使用 注意要成对,重点是代码中有分支或者异常返回的情况,这种情况要在异常返回前先释放锁 mysqlInstanceLock.Lock() slaveHostSql := "show sl ...

  10. Advanced C++ | Virtual Copy Constructor

    这个不懂,等看会了再写...