http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1255

1255 字典序最小的子序列

题目来源: 天津大学OJ
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
给出一个由a-z组成的字符串S,求他的一个子序列,满足如下条件:

1、包含字符串中所有出现过的字符各1个。
2、是所有满足条件1的串中,字典序最小的。
 
例如:babbdcc,出现过的字符为:abcd,而包含abcd的所有子序列中,字典序最小的为abdc。
Input
输入1行字符串S,所有字符均为小写,字符串的长度为L。(1 <= L <= 100000)。
Output
输出包含S中所有出现过的字符,每个字符各1个,并且字典序最小的S的子序列。
Input示例
babbdcc
Output示例
abdc

一开始只考虑了待替换字符后面相邻的那一个字符没想到还有可能出现后面数个在后面都可以被更换使得字典序更小的情况,改了以后还是WA竟然是因为前缀和数组zz的写错了cao。。。
假设字符x已经出现过了,现在考虑将x删掉查到后面会不会使得结果更优,那么x后面肯定要出现一个小于x的字符且这二者间的字符再后面都要能替换,否则的话并不能使答案优化。
 #include<bits/stdc++.h>
using namespace std;
char s[];
deque<char>q;
bool vis[];
int num[];
int main()
{
scanf("%s",s+);
int len=strlen(s+),n,m,i,j,k;
for(i=;i<=len;++i) num[s[i]-'a']++;
for(i=;i<=len;++i)
{
if(!vis[s[i]-'a']){
vis[s[i]-'a']=;
q.push_back(s[i]);
}
else{
for(j=;j<q.size();++j)
{
if(q[j]==s[i]){int j1=-;
{
for(k=j+;k<q.size();++k){
if(q[k]<q[j]){j1=k;break;}
}
if(j1!=-){
bool ok=;
for(k=j+;k<j1;++k)
{
if(num[q[k]-'a']<=){ok=;break;}
}
if(ok){
q.erase(q.begin()+j);
q.push_back(s[i]);
}
}
}
break;
}
}
}
num[s[i]-'a']--;
}
for(int i=;i<q.size();++i)cout<<q[i];puts("");
return ;
}

还有一种做法是用栈。

如果当前元素已经在栈中,则不用操作,否则判断栈顶元素大于当前元素的在后面是否还会出现,如果会的话pop掉,直到栈空或不满足条件或栈顶元素小的情况停止pop,把si入栈。     二者时间差不大多。

 #include<bits/stdc++.h>
using namespace std;
char s[];
stack<char>q;
bool vis[];
int num[];
void out()
{
if(q.empty()) return;
char c=q.top();q.pop();
out();
cout<<c;
}
int main()
{
scanf("%s",s+);
int len=strlen(s+),n,m,i,j,k;
for(i=;i<=len;++i) num[s[i]-'a']++;
for(i=;i<=len;num[s[i++]-'a']--)
{
if(vis[s[i]-'a']) continue;
while(!q.empty()&&q.top()>s[i]&&num[q.top()-'a']>) {vis[q.top()-'a']=;q.pop();}
q.push(s[i]);
vis[s[i]-'a']=;
}
out();puts("");
return ;
}

51nod 1255 贪心/构造的更多相关文章

  1. 贪心+构造 Codeforces Round #277 (Div. 2) C. Palindrome Transformation

    题目传送门 /* 贪心+构造:因为是对称的,可以全都左一半考虑,过程很简单,但是能想到就很难了 */ /************************************************ ...

  2. 贪心/构造/DP 杂题选做

    本博客将会收录一些贪心/构造的我认为较有价值的题目,这样可以有效的避免日后碰到 P7115 或者 P7915 这样的题就束手无策进而垫底的情况/dk 某些题目虽然跟贪心关系不大,但是在 CF 上有个 ...

  3. 贪心/构造/DP 杂题选做Ⅱ

    由于换了台电脑,而我的贪心 & 构造能力依然很拉跨,所以决定再开一个坑( 前传: 贪心/构造/DP 杂题选做 u1s1 我预感还有Ⅲ(欸,这不是我在多项式Ⅱ中说过的原话吗) 24. P5912 ...

  4. 贪心/构造/DP 杂题选做Ⅲ

    颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...

  5. 51nod 1163贪心

    用优先队列来贪心,是一个很好地想法.优先队列在很多时候可以维护最值,同时可以考虑到一些其他情况. http://www.51nod.com/onlineJudge/questionCode.html# ...

  6. Codeforces Round #301 (Div. 2)(A,【模拟】B,【贪心构造】C,【DFS】)

    A. Combination Lock time limit per test:2 seconds memory limit per test:256 megabytes input:standard ...

  7. Codeforces 1082D Maximum Diameter Graph (贪心构造)

    <题目链接> 题目大意:给你一些点的最大度数,让你构造一张图,使得该图的直径最长,输出对应直径以及所有的边. 解题分析:一道比较暴力的构造题,首先,我们贪心的想,要使图的直径最长,肯定是尽 ...

  8. hdu 4982 贪心构造序列

    http://acm.hdu.edu.cn/showproblem.php?pid=4982 给定n和k,求一个包含k个不相同正整数的集合,要求元素之和为n,并且其中k-1的元素的和为完全平方数 枚举 ...

  9. Codeforces Round #335 (Div. 2) D. Lazy Student 贪心+构造

    题目链接: http://codeforces.com/contest/606/problem/D D. Lazy Student time limit per test2 secondsmemory ...

随机推荐

  1. 回顾: Python面向对象三大特性

    继承 待整理^_^ 封装 待整理^_^ 多态 待整理^_^

  2. 内置函数:min 用法

    内置函数:min 用法 源码 def min(*args, key=None): # known special case of min """ min(iterable ...

  3. return和yield的区别

    # return 返回给调用者值,并结束此函数.#yiled 返回给调用者值,并将指针停留着当前位置.

  4. 印象笔记ipad端快捷键

  5. 关于服务器jdk版本和代码编译调试兼容问题

    首先代码是基于哪个版本编写和调试,有没有用到新版本jdk新的特性,类啊接口啊啥的,用到了的话,就不行了 其他都共有的是向下兼容的 最好开发环境的jdk版本和部署环境的jdk版本匹配.

  6. F110 BADI增强

    F110*JOB*&------------------------------------------------------------- F110 BADI FI_BSTM_MC_EXI ...

  7. payload有效载荷(转)

    payload 记载着信息的那部分数据.通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如这一批数据量的大小,校验位等,这样就相当于给已经 ...

  8. Loadrunder脚本篇——web_custom_request函数介绍

    c语言版本: int web_custom_request(const char *RequestName, , [EXTRARES, ,] LAST ); 参数说明: RequestName     ...

  9. Loadrunder脚本篇——Running Time setting之Additional attributes

    作用说明 为Vuser脚本提供额外自定义参数.额外参数设置可应用于所有Vuser脚本类型. 说明: Add:添加一个参数 Remove:移除一个参数 可以在这里先输入一些常用的参数名及对应的值,类似常 ...

  10. 每天一个Linux命令(57)rpm命令

        rpm是一个功能十分强大的软件包管理系统.     (1)用法:     用法:  rpm  [参数]  [包名]     (2)功能:     功能:  使得在Linux下安装.升级和删除软 ...