http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11342

Problem description

The chemical formula of a molecule M describes its atomic make-up. Chemical formulas obey the following grammar:

      M := G | M G
G := S | S C
S := A | '(' M ')'
C := T | N E
E := D | D E
T := '2' | ... | '9'
N := '1' | ... | '9'
D := '0' | .. | '9'
A := U | U L | U L L
U := 'A' | .. | 'Z'
L := 'a' | .. | 'z'

The count C represents a multiplier for the subgroup S that precedes it. For example, H2O has two H (hydrogen) and one O (oxygen) atoms, and (AlC2)3Na4 contains 3 Al (aluminum), 6 C (carbon) and 4 Na (sodium) atoms.

Input
  The input will contain data for one or more test cases. For each test case, there will be one line of input, containing a valid chemical formula. Each line will have no more than 100 characters. 
Output
  For each line of input there will be one line of output which is the atomic decomposition of the chemical in the form of a sum as shown in the sample output. The atoms are listed in lexicographical order, and a count of 1 is implied and not explicitly written. There are no blank spaces in the output. All of the counts in the correct output will be representable in 32-bit signed integers. 
Sample Input
H2O
(AlC2)3Na4
Sample Output
2H+O
3Al+6C+4Na
Problem Source

2012 Rocky Mountain Regional Contest

题意:按字典序升序输出所有元素

思路:一道恶心的模拟题啊,暴力模拟即可,弄了好久啊,一开始是全部算出来在进行叠加,但是超时了,于是就每次计算完一个元素后都放进去,终于过了,0ms

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; struct node
{
char word[105];
int cnt;
} a[105]; char str[105]; int cmp(node x,node y)
{
return strcmp(x.word,y.word)<0;
} int main()
{
while(~scanf("%s",str))
{
int len = strlen(str),flag = 1;
int l = -1,ll = 0;
int i,j,k,zuo,t;
for(i = 0; i<=100; i++)
memset(a[i].word,'\0',sizeof(a[i].word));
for(i = 0; i<len; i++)
{
if(str[i]>='A' && str[i]<='Z')
{
if(l!=-1)
a[l].word[ll] = '\0';
flag = 1;
ll = 0;
if(l!=-1)
{
int tt = 0,c;
for(j = k; j<len; j++)//从该元素往后走,找括号
{
if(str[j] == '(')//找左括号
tt++;
else if(str[j] == ')')
{
if(tt)//与左括号匹配,消去一个无用的右括号
tt--;
else
{
zuo--;//匹配包含该元素的左括号
j++;
c = 0;
while(str[j]>='0' && str[j]<='9')//计算括号后面的数字
{
c = c*10+str[j]-'0';
j++;
}
j--;
if(c)//非0则与原来的数字相乘
a[l].cnt*=c;
}
}
if(!zuo)//没有包含该元素的左括号则跳出
break; }
}
for(j = 0; j<l; j++)
{
if(!strcmp(a[j].word,a[l].word))//有与该元素匹配的就直接将该元素的数目累加,并且长度减1,没有则不管
{
a[j].cnt+=a[l].cnt;
l--;
break;
}
}
l++;//下一个元素
a[l].word[ll++] = str[i];//放进结构体
k = i;//记录位置
a[l].cnt = 1;//初始化个数为1
t = zuo = 0;
for(j = i; j>=0; j--)//记录左边将此元素包裹在内的左括号的数量
{
if(str[j] == ')')
t++;
else if(str[j] == '(')
{
if(t)
t--;
else
zuo++;
}
}
}
else if(str[i]>='a' && str[i]<='z')
a[l].word[ll++] = str[i];
else if(str[i]>='0' && str[i]<='9' && flag && (str[i-1]>='A' && str[i-1]<='Z' || str[i-1]>='a' && str[i-1]<='z') )
{//这条件很重要,这是计算紧跟在元素后的数字,但不能算括号后面的数字
flag = 0;
int c = 0;
while(str[i]>='0' && str[i]<='9')
{
c = c*10+str[i]-'0';
i++;
}
i--;
if(c)
a[l].cnt*=c;
}
}
while(zuo)//这是计算最后一个元素,因为最后一个元素可能没有算
{
int tt = 0,c;
for(j = k; j<len; j++)
{
if(str[j] == '(')
tt++;
else if(str[j] == ')')
{
if(tt)
tt--;
else
{
zuo--;
j++;
c = 0;
while(str[j]>='0' && str[j]<='9')
{
c = c*10+str[j]-'0';
j++;
}
j--;
if(c)
a[l].cnt*=c;
}
}
}
}
for(j = 0; j<l; j++)
{//医务室计算最后一个元素
if(!strcmp(a[j].word,a[l].word))
{
a[j].cnt+=a[l].cnt;
l--;
break;
}
}
sort(a,a+l+1,cmp);
if(a[0].cnt!=1)
printf("%d%s",a[0].cnt,a[0].word);
else
printf("%s",a[0].word);
for(i = 1; i<=l; i++)
{
if(a[i].cnt!=1)
printf("+%d%s",a[i].cnt,a[i].word);
else
printf("+%s",a[i].word);
}
printf("\n");
} return 0;
}

HUNNU11342:Chemistry(模拟)的更多相关文章

  1. 「模拟8.29」chinese(性质)·physics·chemistry(概率期望)

    T1  chinese 根据他的问题i*f[i]我们容易联想到,答案其实是每种方案中每个点的贡献为1的加和 我们可以转变问题,每个点在所有方案的贡献 进而其实询问就是1-k的取值,有多少中方案再取个和 ...

  2. [CSP-S模拟测试]:chemistry(期望DP+组合数学)

    题目传送门(内部题27) 输入格式 第一行有$4$个整数$n,k,p,q$.第二行有$n$个整数$a_i$.接下来有$n-1$行,每行有两个整数$u,v$,表示$u$与$v$之间通过化学单键连接. 输 ...

  3. URAL 2046 A - The First Day at School 模拟题

    A - The First Day at SchoolTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudg ...

  4. yyy loves Easter_Egg I(恶心的字符串模拟)

    题目背景 Soha的出题效率着实让人大吃一惊.OI,数学,化学的题目都出好了,物理的题还没有一道.于是,Huntfire,absi2011,redbag对soha进行轮番炸,准备炸到soha出来,不料 ...

  5. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  6. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  7. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  8. HTML 事件(四) 模拟事件操作

    本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4.  ...

  9. 模拟AngularJS之依赖注入

    一.概述 AngularJS有一经典之处就是依赖注入,对于什么是依赖注入,熟悉spring的同学应该都非常了解了,但,对于前端而言,还是比较新颖的. 依赖注入,简而言之,就是解除硬编码,达到解偶的目的 ...

随机推荐

  1. 基于visual Studio2013解决C语言竞赛题之0506选择排序

     题目

  2. Linux驱动编写(块设备驱动代码)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 按照ldd的说法,linux的设备驱动包括了char,block,net三种设备.char设备 ...

  3. line-height具体解释

    章:浏览器与Hack].7.3.5 应用:单行文字在垂直方向居中在网页设计中,往往为了突出标题而加入背景图案.如图7-31所看到的. watermark/2/text/aHR0cDovL2Jsb2cu ...

  4. android学习--视图列表(ListView和ListActivity)

    说明: 视图列表(ListView和ListActivity)与AutoComplete.Spinner类似,它们都须要一个供显示的列表项,能够须要借助于内容Adapter提供显示列表项 创建List ...

  5. QNX驱动开发——中断处理(转载)

    原文网址:http://blog.csdn.net/daniellee_ustb/article/details/7841894 在操作系统中,对于中断的处理一直是一件麻烦事,其实主要是对操作系统的中 ...

  6. 16-UIKit(AutoLayout、Animation)

    目录: 一.AutoLayout自动布局 二.动画(Animation) 回到顶部 一.AutoLayout自动布局 1.什么是AutoLayout 从ios6开始引入的新技术,是新版的自动布局技术 ...

  7. 一道经典的C++结构体的题目

    题目描述: 有10个学生,每个学生的数据包括学号.姓名.英语.数学.物理三门课的成绩,从键盘输入10个学生数据,要求打印出3门课程的总平均成绩,以及最高分的学生的数据(包括学号,姓名,3门课的平均成绩 ...

  8. WebService推送数据,数据结构应该怎样定义?

    存放在Session有一些弊端,不能实时更新.server压力增大等... 要求:将从BO拿回来的数据存放在UI Cache里面,数据库更新了就通过RemoveCallback "告诉&qu ...

  9. Android 应用开发推荐书单

    本文由 伯乐在线 - zerob13 翻译自 fromdev.欢迎加入Android小组.转载请参见文章末尾处的要求. Android 已经成为了世界上最受欢迎的操作系统之一.成千上万的智能手机和平板 ...

  10. SQL Server 2008中文企业版下载地址和序列号[转]

    SQLSERVER2008下载链接http://sqlserver.dlservice.microsoft.com/dl/download/B/8/0/B808AF59-7619-4A71-A447- ...