luogu的oier化学一定都很好

这个题是让我们模拟计算化学方程式的过程。

时间复杂度类似的题目。

我们可以根据括号,将求解分成若干个步骤。

从外部看,需要将一对括号看做一个整体。然后进行计算。

从内部看,括号外面的下标对内部没有影响。

我们可以将给定的分子式,看做在一个大括号内。

然后写出一个函数,函数的作用就是求解某一个括号内的质量。

当然,这个函数很显然是递归的。递归就要用到栈。所以是隐形的开了栈。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
const int maxn=5000;
int T[maxn][100],tail;
int End[maxn];
char c[maxn];
void insert(char *A,int len,int w)
{
int now=0;
for(int i=1;i<=len;i++)
{
int nxt=A[i]-'A';
if(!T[now][nxt]) T[now][nxt]=++tail;
now=T[now][nxt];
}//trie树
End[now]=w;
return ;
}
int get(int &now,int len)
{
int res=0,R=T[0][c[now++]-'A'];
while(c[now]>='a'&&c[now]<='z')//还在一个原子内
{
int nxt=c[now]-'A';
if(!T[R][nxt]) return -0x7fffffff;
R=T[R][nxt];
now++;
}
if(!End[R]) return -0x7fffffff;//没有这个原子,返回非法
return End[R];//返回单个原子的质量
}
int calc(int &now,int len)
{
int res=0;
while(c[now]<='9'&&c[now]>='0'&&now<=len)
{
res=res*10+c[now]-'0';
now++;
}//数字
return res;
}
int dfs(int &now,int len)//
{
int sum=0;//括号内原子的质量总和
while(c[now]!=')'&&now<=len)//没有到右括号。PS:一次循环处理一个原子和其下标(若没有则不处理)
{
int pas=0,x=1;//pas为原子质量,x为下标
if(c[now]=='(')//遇到一个左括号
pas=dfs(++now,len);//递归处理
else
if(c[now]<'0'||c[now]>'9')
pas=get(now,len);//计算原子质量
if(c[now]==')'||pas<0)//后面没有下标而且到了右括号
{
sum+=pas;//加上,退出循环
break;
}
if(c[now]>='0'&&c[now]<='9')
x=calc(now,len);//计算下标
sum+=pas*x;//相乘
}
now++;//越过右括号
return sum;
}
int main()
{
while(true)
{
int weight;
scanf("%s",c+1);
scanf("%d",&weight);
int len=strlen(c+1);
if(c[1]=='E'&&c[2]=='N'&&c[3]=='D') break;
insert(c,len,weight);
}//输入元素
while(true)
{
scanf("%s",c+1);
if(c[1]=='0') break;//终止条件
int len=strlen(c+1);//长度
c[len+1]=')';//将整个分子式括号扩起来,只括右半部分的原因是,我写的函数,在所处理的括号的区间是左开右闭的。
int n=1;
int ans=dfs(n,len+1);
if(ans<0) printf("UNKNOWN\n");//不合法。
else printf("%d\n",ans);
}//计算
}

附带:豪华大样例(当然可能有锅)

P2382 化学分子式的更多相关文章

  1. 题解 P2382 【化学分子式】

    题目 不懂为什么,本蒟蒻用在线算法打就一直炸...... 直到用了"半离线"算法...... 一遍就过了好吗...... 某位机房的小伙伴一遍就过了 另一位机房的小伙伴也是每次都爆 ...

  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. 面向切面编程 (AOP )

    什么是面向切面编程? 面向切面编程就是(AOP --- aspect-oriented programming), 在百科上说: 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一 ...

  2. 02-struts2结果常见的四种处理方式

    1 转发 <!--转发 --> <action name="Demo1Action" class="www.test.a_result.Demo1Act ...

  3. ZwQueryVirtualMemory暴力枚举进程模块

    0x01 前言 同学问过我进程体中EPROCESS的三条链断了怎么枚举模块,这也是也腾讯面试题.我当时听到也是懵逼的. 后来在网上看到了一些内存暴力枚举的方法ZwQueryVirtualMemory. ...

  4. e.target和e.event和event.srcElement

    e.target 是目标对象,e.event是目标所发生的事件,event.srcElement捕获当前事件作用的对象 1. $(function(){ $("li:has(ul)" ...

  5. Linux配置JDK1.8环境变量

     每次感觉配这个都很简单,但每次都要查一下,毕竟配错一点 后面都比较麻烦,记录一下,方便以后查看. linux 下安装jdk和windows下的安装是一样的,之前在windows安装的时候是先下载压缩 ...

  6. scss-算术运算符

    由于scss具有编程语言的特点,那么运算符是必不可少的. 下面就通过代码实例分别做一下介绍. 一.赋值运算符: 赋值运算符就是我们最为熟悉的冒号(:),用来给声明的变量赋值. 代码实例如下: $hig ...

  7. JSP 之 8种HTTP的请求方式 之 页面组成等

    HTTP请求的方法: HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式   1.OPTIONS 返回服务器针对特定资源所支持的HTTP请 ...

  8. Android 隐式 Intent 跳转注意事项

    前几天正好看到<阿里巴巴 Android 开发手册>中提到的: “Activity 间通过隐式 Intent 的跳转,在发出 Intent 之前必须通过 resolveActivity 检 ...

  9. 私网IP访问Internet

    公网.内网是两种Internet的接入方式. 内网接入方式:上网的计算机得到的IP地址是Internet上的保留地址,保留地址有3种形式: A类地址:10.0.0.0~10.255.255.255 B ...

  10. php json_encode 中文乱码解决方法

    本文列举3个方法,实现json_encode()后的string显示中文问题. 做接口时不需要,但存log时帮了大忙了. 在贴代码前,必须贴上官方param和return,链接:http://php. ...