LuoguP2382 化学分子式 题解
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 化学分子式 题解的更多相关文章
- 题解 P2382 【化学分子式】
题目 不懂为什么,本蒟蒻用在线算法打就一直炸...... 直到用了"半离线"算法...... 一遍就过了好吗...... 某位机房的小伙伴一遍就过了 另一位机房的小伙伴也是每次都爆 ...
- P2382 化学分子式
luogu的oier化学一定都很好 这个题是让我们模拟计算化学方程式的过程. 和时间复杂度类似的题目. 我们可以根据括号,将求解分成若干个步骤. 从外部看,需要将一对括号看做一个整体.然后进行计算. ...
- .Net Request.Form含有危险字符的处理办法
今天我们的网站遇到一个问题,下标就类似于化学分子式这样的是需要用"<sub></sub>"这个标签括起来的,当时没有转义,有部分标签就显示不出来了, 后来我 ...
- 软硬大比拼 硅胶、TPU和PC材质对比
手机保护壳的材质有很多种,目前保护壳市场上最为常见的就是硅胶.TPU.PC材质了.那么我们不禁要问,PU.硅胶.PC三材质到底有哪些区别呢?普通消费者在购买保护壳的时候能否从外表就能看出保护壳材质?P ...
- 【LGR-048 五周年庆贺】洛谷6月月赛
Luogu的五周年庆典比赛,还是比较满意的. 题目清新不毒瘤,数据优质不卡常,解法自然,为出题人点赞. 前三题的难度都很低,T5个人感觉还好.但是最后那个splay+hash是什么神仙东西. 最后好像 ...
- 【转】DSL
DSL DSL 时不时地会成为一个话题,所以今天想专门说一下. DSL 也就是 Domain Specific Language 的简称,是指为某些特定领域(domain)设计的专用语言.举个例子,L ...
- NLP总览
一.自然语言处理概述 1)自然语言处理:利用计算机为工具,对书面实行或者口头形式进行各种各样的处理和加工的技术,是研究人与人交际中以及人与计算机交际中的演员问题的一门学科,是人工智能的主要内容. 2) ...
- NLP知识十大结构
NLP知识十大结构 2.1形式语言与自动机 语言:按照一定规律构成的句子或者字符串的有限或者无限的集合. 描述语言的三种途径: 穷举法 文法(产生式系统)描述 自动机 自然语言不是人为设计而是自然进化 ...
- SuperSubScriptHelper——Unicode上下标辅助类
在项目的实施过程中,类似化学分子式.平方.立方等,需要处理上.下标字符. 上下标字符的实现,大致有两种方式,一种是字符本身包含上下标信息,另一种方式是通过格式化标记实现上下标字符的显示. Word中的 ...
随机推荐
- [JS高程] 特殊的原始值类型
目录 原始值包装类型 (特殊引用类型) 原始值包装类型和应用类型的区别 原始值包装类型 (特殊引用类型) 在ES6 时,ECMAScript 数据类型是这样去分类的: 原始值(基本数据类型) Numb ...
- 第09章 MySQL子查询
第09章 MySQL子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入. SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要 ...
- maven私服-配置本地私服环境之jar包下载环境搭建
我们前面已经搭建好环境了,就是maven里没有代码,如何导入jar包管理jar包 maven-public仓库组:已有 maven-central代理仓库:从直接代理maven中央仓库,修改为代理阿里 ...
- docker版本演变,安装,基本命令
1.docker 版本信息 Docker CE在17.03版本之前叫Docker Engine,版本号从0.1.0(2013-03-23)~1.13.1(2017-02-08),详见https://d ...
- IEnumerator vs Iterator
IEnumerator vs Iterator IEnumerator 不考虑Reset方法和原始列表的可变性,NoveNext和Current的只读向前用法: Initially, the enum ...
- Codeforces 1491H - Yuezheng Ling and Dynamic Tree(分块)
Codeforces 题目传送门 & 洛谷题目传送门 *3400 的毒瘤 H 题,特意写个题解纪念一下( 首先对于这种数据结构不太好直接维护的东东可以考虑分块.然鹅我除了分块其他啥也没想到 我 ...
- nohup使用
nohup:不挂断运行 在忽略挂起信号的情况下运行给定的命令,以便在注销后命令可以在后台继续运行. 可以这么理解:不挂断的运行,注意并没有后台运行的功能,就是指,用nohup 运行命令可以是命令永远运 ...
- GORM基本使用
GORM 目录 GORM 1. 安装 2. 数据库连接 3. 数据库迁移及表操作 1. 安装 go get -u github.com/jinzhu/gorm 要连接数据库首先要导入驱动程序 // G ...
- 42-Remove Nth Node From End of List
Remove Nth Node From End of List My Submissions QuestionEditorial Solution Total Accepted: 106592 To ...
- 4G网络 LTE、 FDD 和TD网络格式区别
1.LTE是long term evolution的缩写,即长期演进计划,是3GPP组织推出的移动通信3G技术向4G过渡的中间标准,并不是真正意义上的4G通信. 2.FDD是移动通信系统中使用的全双工 ...