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. UE-9260使用说明1

    UE-9260使用说明 序号 版本号 日期 备注 1 V0.1 2015-03-21 原始版本号.作者:xiaobin 2 3 4 5 主机环境 1.烧写操作 仿真器和FTP烧写 OS: Win XP ...

  2. [置顶] JNI之java传递数据给c语言

    1.首先创建 DataProvider类: package com.pl.ndkpassdata; public class DataProvider { static{ System.loadLib ...

  3. shell字符串替换

  4. HDOJ 3047 带权并查集

    解题思路转自: http://blog.csdn.net/azheng51714/article/details/8500459 http://blog.csdn.net/acresume/artic ...

  5. 用来解析,格式化,存储和验证国际电话号码:libphonenumber

    用来解析,格式化,存储和验证国际电话号码:libphonenumber libphonenumber是Google的公共Java.C++和Javascript库用来解析,格式化,存储和验证国际电话号码 ...

  6. JVM调优总结(八)-典型配置举例2

    常见配置汇总 堆设置 -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值.如:为3,表示年轻代与年老代比值为 ...

  7. RVCT的Linux环境变量配置 ARM® RVDS™ 4.1(b713)

    下载解压 armrvds.tar.gz到/opt 下 在自己的build.sh下导入RVCT的环境变量配置ARM® RVDS™4.1(b713): export ARMROOT=/opt/armrvd ...

  8. windows下Eclipse安装Perl插件教程

    windows下Eclipse安装Perl插件教程 想用eclipse编写perl.网上看了很多资料.但EPIC插件的下载连接都失效了.无奈,只好自己动手写个教程记录一下. 准备工作: 安装好Ecli ...

  9. 仿StackOverflow开发在线问答系统

    仿StackOverflow开发在线问答系统 [第二期11月9日开课]使用Python Flask Web开发框架实现一套类似StackOverflow的在线问答平台LouQA,具备提问,回答,评论点 ...

  10. Win8.1应用开发之动态磁贴

    using demo02.Common; using System; using System.Collections.Generic; using System.IO; using System.L ...