题目

不懂为什么,本蒟蒻用在线算法打就一直炸......

直到用了"半离线"算法......

一遍就过了好吗......

某位机房的小伙伴一遍就过了

另一位机房的小伙伴也是每次都爆零,还大叫"我再也不打这一题了"

嗯......真香!


【分析】

本蒟蒻看到题目的第一做法是考虑怎么储存元素的质量

假设我们把只由一个字母构成的元素符号看成后面补了一个空格

那么,每个元素都是由两位字符组成

其中第一位一定为大写,第二位一定为小写或空格

那么,也就是说,最多给定 \(26 \times 27 = 702\) 种不同的元素

因此,我们直接可以开一个数组 \(m_i\) 存各个元素的质量

根据上面的提示,显然,这边用27进制会比较 elegant 优雅

同时,我们可以在读入字符时加一个判定

读入完大写字符后,直接读入下一位

如果是空格,显然应该跳出

如果是小写,显然应该进制转换

根据题目,输入结束的标志为

"END_OF_FIRST_PART"

这是个很明显的标志,它的第二位也是大写

我们可以利用这个标志,判断什么时候读入部分结束

至于数字读入,可以参考读入优化的思路

这边加一条忠告 (过来人的语气) :读到结束标志了记得吞掉整行


嗯,继续讲一下计算分子量的实现

这边本蒟蒻不懂为什么,按一边读入一边压栈一边算的在线算法打一直会出错(重点是本地测还没问题),所以就用字符数组来存了......

我们用一个字符数组 (这里特地强调,不是字符串 string ,因为本蒟蒻觉得那个很耗时间) 来存化学式

接下来的运行跟读入其实差不多

不过,这边要加一个限制

如果出现括号,我们需要先计算括号内的值,再乘上括号的系数(在反括号后)

这边其实就是一个栈

一旦出现括号,说明要先算里面的,我就把之前算好的先放到栈里面

等对应的反括号出现,我们就可以直接算出这个括号描述的原子团的值

把这个值与系数的乘积加回上一层的栈里,就可以把这个括号解决了

那其他的细节就看一下本蒟蒻 奇丑无比 的代码吧


【代码】

那本蒟蒻就放代码了

#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
int m[800]={0};
char s[100]={0};
inline int READ_NAME(char &c){
register int ans=0; while(!isupper(c)) c=getchar();
ans=c-'A'; c=getchar();
if(islower(c)) ans+=(c-'a'+1)*26,c=getchar();
return ans;
}//元素名读入
inline int READ_NUM(char &c){
register int ans=0; while(!isdigit(c)) c=getchar();
while(isdigit(c)) ans=(ans<<3)+(ans<<1)+c-'0',c=getchar();
return ans;
}//数字读入
int READ_CHE(){
int stack[80]={0},size=0,pos=0,len=strlen(s);
//stack[i]表示第i层括号内的值
while(pos<len){
if(!(s[pos]^'(')) stack[size++],pos++;
//指针记得后移
else if(!(s[pos]^')')){
int tmp=0;
if(!isdigit(s[pos+1])) tmp=1;
while(isdigit(s[pos+1])) tmp=(tmp<<3)+(tmp<<1)+s[++pos]-'0';
//读入优化类似代码
pos++;
stack[size-1]+=stack[size]*tmp;
stack[size--]=0;
//避免出现被(NH4)[Al(OH)4]卡掉的情况,虽然不知道是否存在这个物质
}
else if(isupper(s[pos])){
int Tmp=s[pos]-'A';
if(islower(s[pos+1])) Tmp+=(s[pos+1]-'a'+1)*26,pos++;
//计算编码
if(!m[Tmp]) return -1;
//没读入到,直接返回"UNKNOWN"的指令
int tmp=0;
if(!isdigit(s[pos+1])) tmp=1;
while(isdigit(s[pos+1])) tmp=(tmp<<3)+(tmp<<1)+s[++pos]-'0';
pos++;
stack[size]+=m[Tmp]*tmp;
}
}
return stack[0];//返回第0层括号内的值
}//质量计算
inline void pre(){
char c=getchar();
while(1){
int tmp=READ_NAME(c);
if(isupper(c)){//读到结束语句
while((c^'\n')&(c^'\r')) c=getchar();//吞掉整行
return ;
}
m[tmp]=READ_NUM(c);
}
}
int main(){
pre();
scanf("%s",s);
while(s[0]^'0'){
int tmp=READ_CHE();
if(tmp>0) printf("%d\n",tmp);
else puts("UNKNOWN");
//读到未知元素会返回 -1
memset(s,0,sizeof(s));
//记得清零,避免被 H2O F2 卡掉
scanf("%s",s);
}
return 0;
}

最后安利一下 本蒟蒻的博客

题解 P2382 【化学分子式】的更多相关文章

  1. P2382 化学分子式

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

  2. LuoguP2382 化学分子式 题解

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

  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. 12 文件流(Unity3D)

      关于文件操作在脚本中可以通过xml或其他的与文件相关的类中封装的一些方法可读取本地Asset文件夹下的xml文档和json文档到游戏中.但是这样操作文件难免会有拖延,C#提供了一种文件操作的方法, ...

  2. python --- request返回值乱码问题

    1.分析 a)<HTTP权威指南>里第16章国际化里提到,如果HTTP响应中Content-Type字段没有指定charset,则默认页面是'ISO-8859-1'编码.一般现在页面编码都 ...

  3. s5pc100开发板linux内核移植

    相关软件下载地址:http://pan.baidu.com/s/16yo8Y 应用于FSC100开发板 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc linux-2.6 ...

  4. 登录之后跳转到登录之前的页面 之 Referer 的坑

    简而言之:通过鼠标在页面上点击链接发送请求,请求header中会包含referer信息, 通过在浏览器地址栏书写并发送请求的,header中不会有referer信息. 为了完成登录动作成功后返回原页面 ...

  5. Nim游戏(尼姆博弈)

    这里是尼姆博弈的模板,前面的博弈问题的博客里也有,这里单列出来. 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非 ...

  6. Android自定义View——仿滴滴出行十大司机评选活动说明

    滴滴出行原版图 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 仿图 ? ? ? ? ? ? 1.分 ...

  7. python try-except处理异常的常用方法分析

    在写python程序时遇到异常想要进行处理时,可以使用try-except来处理,例如: try: 语句1 语句2 . . 语句N except .........: do something ... ...

  8. HttpClient系列~StringContent与FormUrlEncodedContent

    知识点 本文是一个很另类的文章,在项目中用的比较少,但如果项目中真的出现了这种情况,我们也需要知道如何去解决,对于知识点StringContent和FormUrlEncodedContent我们应该了 ...

  9. @Autowired注解与@Resource注解的区别(详细)

    相信对现在Java码农来说,@Autowired跟@Resource并不陌生,二者都可以自动注入,但是两者的区别很多时候并没有被注意到. 一.注解的出处 @Autowired是Spring提供的注解, ...

  10. Java 过滤器Filter,Java Filter 不拦截某些请求 Java 过滤器支持Ajax请求

    ================================ ©Copyright 蕃薯耀 2020-01-10 https://www.cnblogs.com/fanshuyao/ 一.Java ...