P2382 化学分子式
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 化学分子式的更多相关文章
- 题解 P2382 【化学分子式】
题目 不懂为什么,本蒟蒻用在线算法打就一直炸...... 直到用了"半离线"算法...... 一遍就过了好吗...... 某位机房的小伙伴一遍就过了 另一位机房的小伙伴也是每次都爆 ...
- LuoguP2382 化学分子式 题解
Description 你的任务是编写一个能处理在虚拟的化学里分子式的程序,具体地说,给定你所有原子的相对原子质量,求出所有询问的分子的相对分子质量,或者报告不存在. 数据范围:原子质量 \(\leq ...
- .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中的 ...
随机推荐
- sqlplus连接oracle语法
sqlplus文件在product\11.2.0\dbhome_1\BIN目录下. 连接语法:用户名/密码@ip/服务名
- oem的使用
1 浏览器输入下面的网址: 虚拟机[安装orcale的机器]:http://localhost:1158/em/ 本机:http://192.168.47.10:1158/em/ 192.168.47 ...
- opensuse 安装oracle 界面乱码
执行.runInstall时,出现界面乱码 export LANG=en_US export LC_ALL=en_US 终端里 执行这两句.用英文界面安装 再执行 .runInstall
- JavaScript函数和数组总结
JavaScript函数 1. 函数的定义 函数名称只能包含字母.数字.下划线或$,且不能以数字开头.定义时可用函数定义表达式或者函数声明语句. var f = function fact( ...
- Linux抓包工具:tcpdump
tcpdump 是一个命令行实用工具,允许你抓取和分析经过系统的流量数据包.它通常被用作于网络故障分析工具以及安全工具. tcpdump 是一款强大的工具,支持多种选项和过滤规则,适用场景十分广泛.由 ...
- centos6.5下搭建oracle 11g
1.安装依赖 sudo yum install binutils compat-libstdc++-33 compat-libstdc++-33.i686 elfutils-libelf elfuti ...
- 【Shell】shell截取字符串方式(cut、awk、sed命令)
1.cut -b :以字节为单位进行分割.这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志.-c :以字符为单位进行分割. -d:自定义分隔符,默认为制表符. -f:与-d一起使用,指定显示 ...
- node.js分片上传文件
前端 : <html> <head> <title>分片上传文件</title> </head> <body> <div ...
- js使用占位符替换字符串
js使用占位符替换字符串是一个ES6中的模版字符串语法. 在``中使用 ${} var a = 5; var b = 10; console.log(`Fifteen is ${a + b} and ...
- JavaScript数组常用操作总结
我们在日常开发过程中,使用到原生 JavaScript的时候,有时候会频繁的对数组进行操作,今天我把工作以来,经常用到的有关 JavaScript数组的方法总结一下,方便日后工作的时候查找使用! 一. ...