Minimal string CodeForces - 797C

题意:有一个字符串s和空串t和u,每次操作可以将s的第一个字符取出并删除然后放到t的最后,或者将t的最后一个字符取出并删除然后放到u的最后。要求使得最后s和t均为空串。求字典序最小的可能得到的u。

分析:这道题的操作相当于“将s中字符按从左到右顺序入栈,在任意次的入栈后可以进行任意次的出栈”。显然,最后得到字符串的长度一定是相等的,因此字典序最小就是要前面的尽可能的小。因此可以用一个数组分别记录还未入栈的'a'到'z'的个数,按照'a'到'z'的顺序去找。每找一个字符c的第一步是:首先在栈顶找出所有大于等于c的字符,出栈并输出。之后的操作只有在还有未入栈的c时才去做:在原串中还未入栈的部分从前往后找c,把其他字符入栈,把c直接输出(相当于入栈后直接出栈、输出),直到所有未入栈的c没有了。找完'z'后,再将所有栈中剩余字符出栈并输出即可。

 #include<cstdio>
#include<cstring>
char s[];
int a[],now,top;
char st[];
//曾经误将top写成char类型导致re
int main()
{
scanf("%s",s);
int i,len=strlen(s);
for(i=;i<len;i++)
a[s[i]]++;
for(i='a';i<='z';i++)
{
while(top>&&st[top]<=i)
{
printf("%c",st[top]);
top--;
}
while(a[i])
{
while(s[now]!=i&&now<len)
{
st[++top]=s[now];
a[s[now]]--;
now++;
}
while(s[now]==i&&now<len)
{
printf("%c",i);
a[i]--;
now++;
}
}
}
while(top>)
{
printf("%c",st[top--]);
}
return ;
}

最新文章

  1. Spring Boot -- Start Up
  2. 多行文本溢出显示省略号(…) text-overflow: ellipsis
  3. PMO到底什么样?
  4. Redhat 6环境下安装Oracle 12c的方法
  5. 配置iSCSI多路径
  6. C库函数笔记
  7. ssm整合快速入门程序(二)
  8. 搭建TensorFlow中碰到的一些问题(TensorBoard不是内部或外部指令也不是可运行的程序)~
  9. c# 匿名函数
  10. hdu5293 lca+dp+树状数组+时间戳
  11. Java 继承extends、关键字super和this、多态、动态绑定
  12. MYSQL 优化常用方法(转载)
  13. Unity寻路的动态烘焙
  14. 零基础学python习题 - Python必须知道的基础语法
  15. 02-c#基础之01-基础语法(三)
  16. [转]TortoiseSVN客户端的安装
  17. 【Mongodb】数据库操作--备份、还原、导出和导入
  18. [USACO 2018 Open Gold] Tutorial
  19. Android Studio编译的时候提示Gradle无法下载的解决方案
  20. 批量改ID 行形式

热门文章

  1. 查询历史使用过的命令并使用(history)
  2. 高仿webqq做的一个webos桌面效果和web聊天工具,桌面效果完好,功能强大
  3. Docker and Go: why did we decide to write Docker in Go?
  4. XMU C语言程序设计实践(3)
  5. Python作业之购物商城
  6. 一步一步学Silverlight 2系列(6):键盘事件处理
  7. oracle:程序后台提示Io异常: The Network Adapter could not establish the connection)
  8. 书写优雅的shell脚本(插曲)- /proc/${pid}/status
  9. codevs1148传球游戏
  10. UVA 11174 Stand in a Line 树上计数