“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛(D CSL 的字符串)

CSL 的字符串

题解:

从前往后扫一遍 如果当前这个字符本身就是到当前为止第一次出现的,那肯定要留下它吧,就把它放到ans数组里面,并且把这个字母的个数减一(最开始统计的每个字母出现的个数相当于每个字母的剩余个数)然后从这个字母开始遍历ans数组中该字母前面的所有字母 ,如果前面的字母的字典序大于该字母并且该字母还有剩余的话,就把那个字母从ans数组中移出去。注意这句话  while(cnt>0&&ans[cnt-1]>s[i]&&num[ans[cnt-1]])  一定是从该字母的前一个开始,而不是只要存在就行,因为ans数组中的字母到当前为止一定是最优解了  。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=1e5+10;
 7 char s[maxn];
 8 int vis[200];//用来看看字符串中每一个字母是否曾经出现过
 9 int num[200];
10 char ans[maxn];
11 int main()
12 {
13     scanf("%s",s);
14     int len=strlen(s);
15     for(int i=0;i<len;i++)
16         num[s[i]]++;//num数组是统计字符串中每一个字符出现的次数(即该字符的剩余可替换次数)
17     int cnt=0;
18     for(int i=0;i<len;i++)
19     {
20         num[s[i]]--;
21         if(vis[s[i]])//如果s[i]在前面出现了 那么直接跳过
22             continue;
23         //如果s[i]是第一次出现,那么对于当前来说 一定要把它放到ans数组中
24         //while循环的作用是:从ans数组的最后一个字符开始往前遍历,如果该字符比s[i]字典序大,而且剩余可替换次数
25         //不为0,那么说明该字符在后面还出现过,那么把它放到后面会比它在现在的位置使得整个ans字典序更小
26         //所以我们就把该字符之前的标记清零,把它从ans中移走(即cnt--)
27         while(cnt>0&&ans[cnt-1]>s[i]&&num[ans[cnt-1]])
28         {
29
30             vis[ans[cnt-1]]=0;
31             cnt--;
32         }
33         vis[s[i]]=1;
34         ans[cnt++]=s[i];
35     }
36     for(int i=0;i<cnt;i++)
37     {
38         printf("%c",ans[i]);
39     }
40     return 0;
41 }

原文地址:https://www.cnblogs.com/1013star/p/10637180.html

时间: 2024-10-03 17:16:56

“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛(D CSL 的字符串)的相关文章

2018清华大学学生程序设计竞赛暨高校邀请赛

2018清华大学学生程序设计竞赛暨高校邀请赛 A. 绿绿与串串 solution 生成字符串的方式决定了:当字符串中的某个奇回文串的左端为开头,或右端为结尾时,这个奇回文串的中间的位置就是其中一个长度. 时间复杂度:\(O(n)\) B. 赛艇 solution 将路径也弄成一个矩阵,然后压位判断. 时间复杂度:\(O(\frac{1}{64}n^2m^2)\) F. 密码学第三次小作业 solution 一看它给了两个式子就知道不是暴力分解质因子. 中间有一个很特别的性质:\((e_1, e_

“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 B

<神无月>作为盛大游戏2017年的全新原创大作,其开发团队在自研实力强大的传世工作室基础之上,还有美树本晴彦等日本一线知名画师及日本游戏音乐大师崎元仁加盟参与制作.目前正在不限号内测中,有很多玩家进入到神无月的世界中. 在神无月中,有着玩家之间切磋的排位赛,其段位主要分为五大段位,从低到高依次为:新兵.菁英.战将.统帅.王者.每个玩家只有从新兵段位慢慢努力,一点点晋级才能到达王者段位.成为一个王者是每一个玩家的追求和心愿. 假设神无月的段位系统如下: 从低到高的段位依次简记为:D.C.B.A.

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 B合约数

链接:https://www.nowcoder.com/acm/contest/91/B来源:牛客网牛客网没有账号的同学,请用这个注册,支持楼主,谢谢. 题目描述 给定一棵n个节点的树,并且根节点的编号为p,第i个节点有属性值vali, 定义F(i): 在以i为根的子树中,属性值是vali的合约数的节点个数.y 是 x 的合约数是指 y 是合数且 y 是 x 的约数.小埃想知道对1000000007取模后的结果. 输入描述: 输入测试组数T,每组数据,输入n+1行整数,第一行为n和p,1<=n<

2018 ACM-ICPC 中国大学生程序设计竞赛暨丝绸之路程序设计竞赛

三道大水题,其它题都不会做,真是尴尬和无奈啊-- 有想法,但是解决不了,感觉个人不会一些基本解法,终究还是个人学习的内容太少了 E. Copy and Submit II 运行题目程序一遍就知道了 内存超限(没删原程序的a数组) -> 编译错误(只删了原程序的a数组,没删其它a变量) -> 运行超时(按照题目的代码用cin) -> 运行超时(scanf没用EOF) -> 正确通过 满满的泪水----------------------------------------------

2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛-B-precise math function

题目描述 喜爱ACM的PBY同学遇到了一道数学难题,已知底数n,请你帮他准确的计算出结果a = nπ(n的π次方),结果保留小数点后x位. 输入描述: 第一行是一个整数t,表示测试实例的个数: 然后是t行输入数据,每行包含两个正整数n和x,表示底数和保留位数. (1 <= t <= 100,1 <= n <= 500,1 <= x <= 6) 输出描述: 对于每组输入数据,分别输出结果a,每个输出占一行. 示例1 输入 3 1 3 7 6 9 1 输出 1.000 45

SHU 第15届上海大学程序设计联赛夏季赛[热身赛] 第三题(G题) - 英语成绩

看完题目就觉得是个图论题-- 每个人的成绩就是vertice,两个人的分数差就是edge,那么肯定类似于一种relax的方式,不断将每个人的成绩的min往上提, 当然,单纯的遍历一遍G.E肯定不可能就得到yaoge成绩min的最大值,所以直觉上就想到了bellman-ford,写了一发交了就过了 1 #include<cstdio> 2 int n,p,q; 3 int score[105]; 4 struct Edge{ 5 int high,low,delta; 6 }edge[1005]

&quot;巴卡斯杯&quot; 中国大学生程序设计竞赛 - 女生专场(重现)解题思路

此文章可以使用目录功能哟↑(点击上方[+]) 经过这么一次女生赛,告诉我们千万不要小瞧女生,不然会死得很惨,orz... 链接→"巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场(重现)  Problem 1001 Solving Order Accept: 0    Submit: 0 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit : 32768/32768 K (Java/Others)  Problem Descri

&quot;高教社杯&quot;第三届福建省大学生程序设计竞赛

 A.Problem 2102 Solve equation Accept: 1032    Submit: 2471 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description You are given two positive integers A and B in Base C. For the equation: A=k*B+d We know there always existing many non-

“亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 (部分题解)

“亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 F 自动售货机 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 60            测试通过 : 13  题目描述 教学楼有一台奇怪的自动售货机,它只售卖一种饮料,单价5元,并且只收5元.10元面值的货币,但是同学们都很喜欢喝.这个售货机里没有多余的找零,也就是说如果一个持有10元的同学第一个购买,则他不能获得5元找零,但是如果在他之前有一个持有5