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);
}//计算
}

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

最新文章

  1. iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ①)
  2. Bitmap转换成BitmapImage
  3. ASP.NET MVC之视图生成URL(二)
  4. Java中GC的工作原理
  5. [Android Pro] InputStream.skip方法的思考
  6. 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速
  7. 字节流与字符流(FileInputStream类和FileOutputStream类)
  8. MySQL执行计划中key_len详解
  9. [C语言 - 9] typedef
  10. 2015长春 HDU 5531 Rebuild
  11. Java 7 新的 try-with-resources 语句,自动资源释放
  12. Java Hibernate 之连接池详解
  13. http 请求头和响应头
  14. windows下使用vscode编写运行以及调试C/C++
  15. Win10 | Mac 在server上统一办公
  16. Unity3D UGUI下拉菜单/Dropdown组件用法、总结
  17. Unity3D常用网络框架与实战解析 学习
  18. 用Dagger2在Android中实现依赖注入
  19. 小程序文件上传uploadFile
  20. Watermelon -- codeforces

热门文章

  1. Oracle命令整理
  2. 新手 php连接数据库大概。简单过程浅析以及遇到的问题分析
  3. unity3d发布到安卓平台
  4. Excel&amp;&amp;word&amp;&amp;PPT
  5. Where Should an Architect Begin?--reference
  6. Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)
  7. scss-算术运算符
  8. 支持触屏的zepto轮播图插件
  9. ArcGisJS实现地图常用工具条、距离测量和面积测量(非官方实例)
  10. 【读书笔记】如何高效学习(Learn More ,Study Less)