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. AWVS介绍(转)

    使用AWVS对域名进行全局分析,深入探索: 首先,介绍一下AWVS这个工具. Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的网络漏洞扫描工具,它通过网 ...

  2. AIDL使用详解

    一.对AIDL进行说明 AIDL允许定义一个编程的接口来作为客户端和服务端通信的桥梁,AIDL定义了客户端和服务端的编程标准,在Android里边一个进程无法直接访问另一个进程的内存信息,但是要访问的 ...

  3. CentOS 如何安装git server + Gitolite 【配置不成功需要再测试2015-8-20】

    安装git 关于安装git  可以参考 http://gitolite.com/gitolite/install.html 里面有官方的介绍 1. Git 的工作需要调用 curl,zlib,open ...

  4. 动态网页爬取例子(WebCollector+selenium+phantomjs)

    目标:动态网页爬取 说明:这里的动态网页指几种可能:1)需要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成,如一个html里有<div id="test" ...

  5. splinter python浏览器自动化操作,模拟浏览器的行为

    Splinter可以非常棒的模拟浏览器的行为,Splinter提供了丰富的API,可以获取页面的信息判断当前的行为所产生的结果   最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有 ...

  6. android的JNI标准 android的NDK

    转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...

  7. python3.4 尝试 py2exe

    第一次成功将python3.4脚本生成 exe文件. 测试环境:win8.1 32位,python3.4,pyside py打包成exe的工具我所知道的有三种 cx-freeze , py2exe , ...

  8. IntelliJ Idea 经常使用快捷键列表

    Alt+回车 导入包,自己主动修正Ctrl+N   查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L  格式化代码 Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如 ...

  9. JQuery AJAX Demo

    JQuery AJAX Demo APP发展集团:347072638(HTML5,APP) 1.先看一个JQuery AJAX Demo HTML端: <!DOCTYPE html PUBLIC ...

  10. 跨平台编程中的宏定义(__LINE__和__DATE__极其有用)

    要用师兄的计算机算东西,无赖那上面是WINDOWS的系统,为了写出能够跨平台的代码,需要在代码中用到宏来选择编译.一种方法是自己在Makefile里面定义好该平台对应的宏.实际上,编译器基本上都会有一 ...