题目

题目背景

元首和元老正在共同努力学习化学,他们想让电脑帮助他模拟分子式减轻负担。请你帮他设计一个程序。

题目描述

你的任务是编写一个能处理在虚拟的化学里分子式的程序,在真正的化学里,每个分子式描述分子包括一个或者多个原子,但是,它可能没有真正的化学药品。

下面是原子符号和分子式的定义:

分子中一个原子由一个原子符号表示,原子符号由单个大写字母或者一个大写字母和一个小写字母组成。例如:H和He都是原子符号。

一个分子式是一个原子符号的非空序列,例如,\(HHHeHHHe\)是一个分子式,表示一个分子包括\(4\)个\(H\)和\(2\)个\(He\)。

为了方便起见,一段相同的式子,如\(x\cdots x\)(\(n\)个\(X\),\(2\leq n\leq 99\)),可以被缩写为\((X)_n\)。如果\(X\)是一个原子符号,那么括号可以省略。例如,\(HHHeHHHe\)也可以写作\(H_2HeH_2He\),\((HHHe)_2\),\((H_2He)_2\),\(((H)_2He)_2\)。

分子式的定义可以用一种规范的语言描述。简而言之,分子式的语法描述如下:

分子:原子|原子数量|(分子)数字|分子 分子
原子:大写字母|大写字母 小写字母

数字:\(2|3|4|5|\cdots|99|\)
大写字母:\(A|B|\cdots|Z|\)
小写字母:\(a|b|c|\cdots|z|\)

在我们这个虚拟的化学里的每一个原子都有自己的原子质量,给你原子的质量,你的程序必须输出一个用分子式表示的分子质量。分子的质量定义为所有包括的原子的质量之和。例如,假设\(H\)和\(He\)的原子质量为\(1\)和\(4\),那么\((H_2He)_2\)的分子量为\(12\)。

输入输出格式

输入格式:

输入由两部分组成。第一部分是原子表,由一些行组成,每行包括一个原子符号、一个或者多个空格,以及该原子的原子质量(\(\leq 1000\))。没有两行包含相同的原子符号。

第一部分最后仅包括一行字符串"END_OF_FIRST_PART"

第二部分是一些行的序列。每行是一个分子式,不多于\(80\)个字符,而且不包括空格。一个分子最多包括\(10^5\)个原子,一些分子中的原子可能没有在原子表中出现。

最后一行仅一个零,表示输入结束。

输出格式:

输出时一些行的序列,和输入文件的第二部分行数相同。如果分子中的每一个原子都在原子表中出现,输出一个整数,并表示分子质量。否者输出UNKNOWN。不要输出多余的字符。

输入输出样例

输入样例:
H 1
He 4
C 12
O 16
F 19
Ne 20
Cu 64
Cc 333
END_OF_FIRST_PART
H2C
(MgF)2As
Cu(OH)2
H((CO)2F)99
0
输出样例:
14
UNKNOWN
98
7426

题解

第一次写的时候用的栈来模拟, RE+WA, 索性全删了重新用DFS写了一遍就过了\(\cdots \cdots\)

纯模拟, 不多说。

#include <iostream>
#include <map>
#include <string>
#include <cstdio>
#include <cctype>
std::map<std::string, int> elements;
std::string matter;
int cur, weight, length;
inline int GetInt() {register int ret(0);while (cur < length && isdigit(matter[cur])) {ret = ret * 10 + matter[cur++] - '0';}return ret ? ret : 1;
}
inline int Dfs() {register int ret(0);while (cur < length) {if (matter[cur] == '(') {++cur;ret += Dfs();} else if (matter[cur] == ')') {++cur;return ret * GetInt();} else {if (isalpha(matter[cur + 1]) && islower(matter[cur + 1])) {register std::string cur_element = std::string("") + matter[cur] + matter[cur + 1];if (!elements.count(cur_element)) {return -2147483647;}++++cur;ret += elements[cur_element] * GetInt();} else {register std::string cur_element = std::string("") + matter[cur];if (!elements.count(cur_element)) {return -2147483647;}++cur;ret += elements[cur_element] * GetInt();}}}return ret;
}
int main(int argc, char const *argv[]) {{register std::string element;while (std::cin >> element && element != "END_OF_FIRST_PART") {scanf("%d", &weight);elements[element] = weight;}while (std::cin >> matter && matter != "0") {cur = 0, length = matter.length();register int num(Dfs());if (num < 0) {puts("UNKNOWN");} else {printf("%d\n", num);}}}return 0;
}

转载于:https://www.cnblogs.com/forth/p/9773605.html

Luogu P2382 化学分子式 (模拟)相关推荐

  1. P2382 化学分子式

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

  2. 用Smartforms实现化学分子式上下标动态打印

    最近开发QM模块的检验报告,客户提出要按上下标打印分子式(此需求有点变态),对我来说无疑是个挑战,经过自己的摸索花了两天时间终于攻破了此问题,在此要感谢华哥,Feliz,tc_Edison在这个问题上 ...

  3. 知识图谱实战应用16-知识图谱在化学物质结构上的应用,快速查找化学分子式与结构

    大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用16-知识图谱在化学物质结构上的应用,快速查找化学分子式与结构.在化学领域,知识图谱可以应用于化学物质结构上.化学物质结构主要指分子结构和化学键 ...

  4. Luogu P1039 侦探推理(模拟+枚举)

    P1039 侦探推理 题意 题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯 ...

  5. 2022中考化学冲刺模拟测试卷

    可能用到的相对原子质量:H-1 C-12 O-16 C1-35.5 Ca-40 一.选择题(每小题只有一个选项符合题意.每小题2分,共16分) 1. 下列四个事例中一定发生了化学变化的是 ①玻璃片上出 ...

  6. 实验二 XML之数学公式和化学分子式

    依照运行结果图,编写出相应的XML和CSS文档. 现在有一个XML文档运行效果图,要求你根据这个图,把它的XML文档.CSS文档还原出来,该图如下. 实验步骤 分析  根据显示的结果,可以看到该文档有 ...

  7. [luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结

    t1-快速多项式变换(FPT) 题解 看到这个\(f(x)=a_0+a_1x+a_2x^2+a_3x^3+ \cdots + a_nx^n\)式子,我们会想到我们学习进制转换中学到的,那么我们就只需要 ...

  8. 用化学绘图软件写带括号的分子式的方法

    ChemDraw是一款国际通用的化学绘制工具,广泛应用于绘制各种化学结构式,包括结构式.能量图谱.方程式.生物聚合物以及分子式等.对于化学分子式带括号的情况,学习化学的同学都司空见惯,但是你知道如何使 ...

  9. 2022高处安装、维护、拆除考试题库及模拟考试

    题库来源:安全生产模拟考试一点通公众号小程序 2022年高处安装.维护.拆除考试题系高处安装.维护.拆除练习题历年真题!2022高处安装.维护.拆除考试题库及模拟考试依据高处安装.维护.拆除考试教材. ...

最新文章

  1. C++中实现回调机制的几种方式
  2. fedora apache php,Fedora 20下安装搭建LAMP环境Apache+MySQL+PHP
  3. 一篇文章教你弄懂 SpringMvc中的HandlerInterceptor
  4. HBase cell
  5. Linux压缩包和用户管理及开关机指令
  6. 利用云安监控和管理云
  7. ASP.NET Core HTTP 管道中的那些事儿
  8. SpringCloud Alibaba 框架下公司架构图
  9. python反射详解
  10. python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver)...
  11. JKD源码系列(4)-AbstractStringBuilder
  12. wsdl2java wsdl文件_使用axis2的wsdl2java把wsdl生成java文件
  13. protel99SE - 多张原理图生成一张总网表的方法
  14. Playmaker节点工具使用(三)—扩展playmaker
  15. 15块rmb做一个语音识别控制的0.3W白光LED便利USB灯
  16. 烽火狼烟丨Fastjson反序列化漏洞风险提示
  17. 虹科新闻|ATTO 宣布支持 Apple 最新操作系统 macOS® 13 Ventura
  18. redis搭建三主三从架构
  19. t-s模糊神经网络matlab,基于T-S模型的模糊神经网络,Fuzzy Neural Network based on T-S mode,音标,读音,翻译,英文例句,英语词典...
  20. 眼动和脑波相关性分析和回归分析

热门文章

  1. 用计算机faded,求faded简谱(一定是对应计算机的)
  2. 京喜上线微信一级入口,京东下沉的故事才刚刚开始?
  3. element-plus el-input 删除边框 border
  4. 《马上有招儿:PPT商务演示精选20讲(全彩) 》
  5. 刚出来工作应不应该加入创业公司?
  6. C#开发Word控件
  7. 3个月收获数十万用户,易车小程序“小艾懂车”的推广仍有发展空间
  8. 【尚学堂】超火爆的Java游戏羊了个羊_java开发游戏项目
  9. python(基于字典的学生管理系统)
  10. u盘文件损坏怎么恢复数据?