【题目链接】:http://codeforces.com/contest/797/problem/C

【题意】



一开始,给你一个字符串s;两个空字符串t和u;

你有两种合法操作;

1.将s的开头字符加到t后面;

2.将t的最后一个字符加到u的后面去

要求最后使得s和t字符串变成空串;

并且得到的u的字符串的字典序最小;

【题解】



i层循环顺序枚举s字符串的每一个字符;

然后把这第i个字符s[i]加入到t的后面去->用一个栈来模拟;

然后维护栈顶的元素和s中剩下的字符串里面字典序最小的字母;->O(26)得到;设为now;

如果栈顶元素为now;

就把栈顶元素弹到答案字符串后面去;

然后把新的栈顶元素再考虑进去,然后再求字典序最小的字母;

重复上述步骤直至字典序最小的字母不为栈顶元素为止;

这样做就是贪心地保证从最高位开始每一位的字典序都是最小的;



【Number Of WA】



3



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1e5+100; int bo[300],len;
char s[N],now;
stack <char> sta;
string ans; char get_now()
{
for (char t = 'a';t <='z';t++)
if (bo[t])
return t;
return '%';
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
ios::sync_with_stdio(false);
ans="";
cin >> (s+1);
len = strlen(s+1);
rep1(i,1,len)
bo[s[i]]++;
rep1(i,1,len)
{
now = get_now();
sta.push(s[i]);
while (!sta.empty() && sta.top()==now)
{
//assert(sta.top()==now);
ans+=now;
bo[now]--;
sta.pop();
if (!sta.empty())
bo[sta.top()]++;
now = get_now();
}
if (!sta.empty())
bo[sta.top()]--;
}
while (!sta.empty()) ans+=sta.top(),sta.pop();
cout << ans << endl;
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}

最新文章

  1. 用Kotlin实现Android定制视图(KAD 06)
  2. C#Winform窗体中传值
  3. Python中的编码
  4. 高效的使用 Response.Redirect
  5. 循序渐进Python3(四) -- 装饰器、迭代器和生成器
  6. 基于kubernetes构建Docker集群管理详解-转
  7. windows下查看所有进程以及pid
  8. jQuery源码dom ready分析
  9. LA 4731
  10. activemq重启
  11. HW2.10
  12. 前序 中序 后序 遍历 递归 非递归算法 java实现
  13. cocospods 卡在 Analyzing dependencies
  14. window.parent与window.opener的区别
  15. JavaScript遍历对象-总结一
  16. 06-HTML-表格标签
  17. c++检查内存泄漏
  18. Solaris 10主机名和IP地址步骤
  19. 【Net Core】DNX概述
  20. Transaction

热门文章

  1. Git下的冲突解决【转】
  2. padding valid same区别——就是是否补齐0的问题
  3. 怎么看待MYSQL的性能
  4. Map类型介绍与遍历
  5. Java中static final 与 final 的区别(转载)
  6. 慕课网6-2 作业:js实现轮播特效
  7. 调取easyui -windows 返回值问题
  8. $P3931 SAC E一道难题 Tree$
  9. 解决gradle project refresh failed: protocol family unavailable问题的几种方法
  10. 349 Intersection of Two Arrays 两个数组的交集