首页 > 其他分享 >题解 - 出栈序列(2022.10上海月赛丙组T5)

题解 - 出栈序列(2022.10上海月赛丙组T5)

时间:2025-01-02 21:02:34浏览次数:8  
标签:T5 出栈 int 题解 30 序列 字典 las

题目描述

给定一个长度为几的、仅由小写字母组成的字符串,将其按序依次放入栈中。
请问在所有可能的出栈序列中,字典序最小的出栈序列是多少?
输入格式
输入第一行,一个正整数几
输入第二行,一个长度为几的字符串
输出格式
输出所有出栈序列中,字典序最小的出栈序列
数据范围
对于 30%的数据,1<n< 10
0
。对于 60%的数据,1<n< 103
。对于100%的数据,1<n<105
样例数据
输入:
3
yes
输出:
esy
说明:
字符y、e、s依次进栈,所有出栈的可能性有:
{yes}、{yse}、{eys}、{esy}、{sey}
其中 {esy} 的字典序最小

分析

知识点:贪心

解题思路:

记录 l a s i las_i lasi​ 为从 i 开始的后缀的最小字母,可以从后往前扫预处理

那么考虑,在字典序最小的意义下,如果栈顶的数大于后缀,就压栈,否则弹栈

复杂度 O ( n ) O(n) O(n)

把 l a s n + 1 = 30 ( > 26 ) las_{n+1}=30(>26) lasn+1​=30(>26) 可以避免讨论很多细节

代码

#include<bits/stdc++.h>
#define LL long long
using namespace std;
int const N=1e5+10;
int n,st[N],r,las[N];
char s[N];
int main(){
	scanf("%d%s",&n,s+1);
	las[n+1]=30;
	for(int i=n;i;i--) las[i]=min(las[i+1],s[i]-'a');
	for(int i=1;i<=n;i++){
		int x=s[i]-'a'; st[++r]=x;
	//	cout<<x<<' '<<las[i+1]<<endl;
		while(r>0&&st[r]<=las[i+1]) printf("%c",st[r--]+'a');
	}
}

标签:T5,出栈,int,题解,30,序列,字典,las
From: https://blog.csdn.net/qq_73162098/article/details/144874558

相关文章

  • 题解 - 机会成本(2022.9上海月赛丙组T2)
    题目描述明天有门考试,今晚只能复习一门课,请计算应该复习哪一门课,才能让所有考试的分数总和达到最大,如果选择复习第之门课,则这门课的考试分数为a;,若放弃复习第之门课,则这门考试的分数为6;。输入格式第一行:单个整数表示n第二行到第n+1行:每行两个整数表示a;......
  • 【题解】Luogu P7171 [COCI2020-2021#3] Selotejp
    注:题解中\(\operatorname{lsh}\),\(\operatorname{rsh}\),\(\operatorname{or}\)分别表示按位左移、按位右移、按位或,即c++语言中的<<,>>,|。我也是打上轮廓线DP了。设\(f_{x,y,S}\)表示当前在\((x,y)\)格子,前\(m\)个格子的状态为\(S\)时的最小花费。这里的状态是指......
  • USACO2024DEC题解
    P11450[USACO24DEC]FarmerJohn'sCheeseBlockB//FarmerJohn'sCheeseBlockB#include<stdio.h>#include<iostream>usingnamespacestd;intcnt_xy[1005][1005],cnt_yz[1005][1005],cnt_xz[1005][1005];intmain(){intn,q;......
  • [CF2353D] Refined Product Optimality 题解
    首先让我们输出的是不操作的值。不定序,一看就很贪心。经过分类分类分类可证,\(a,b\)都是升序(降序)的时候是最优的。再看加操作的。相当于要维护这两个升序序列。我们发现,每次操作影响的值很少,最多两个值。在一个连续段中,修改的值相当于和末尾值交换,再加一。唐点:找这个末尾没必要......
  • CF848E Days of Floral Colours 题解
    Problem-848E-Codeforces首先,由于整个图是对称的,所以我们将其沿直径分为两半,在算一半答案时把每一段的贡献平方再相加即可。(因为对面也有一段相同长度的也要计入贡献)现在我们的问题转化为了对于一个长为\(n\)的环,你可以给一个点连出一个线头(即在原图中连向对面的边)将其余......
  • Luogu P9646 SNCPC2019 Paper-cutting 题解 [ 紫 ] [ manacher ] [ 贪心 ] [ 哈希 ] [
    Paper-cutting:思维很好,但代码很构式的manacher题。蒟蒻2025年切的第一道题,是个紫,并且基本独立想出的,特此纪念。判断能否折叠我们先考虑一部分能折叠需要满足什么条件。显然,这一部分需要是一个长度为偶数的回文串。那么横向和纵向会不会影响呢?答案是不会,因为横向折了之后,折......
  • CF601E A Museum Robbery 题解
    题目传送门前置知识线段树与离线询问解法普通的回退背包无法处理本题中的删除操作,考虑线段树分治后转化为只进行添加的背包。具体实现时可以对每个深度开一个背包的转移数组,时间复杂度为\(O(nk\logq+qk)\),可以接受。代码#include<bits/stdc++.h>usingnamespacestd;#......
  • 洛谷 P11487 「Cfz Round 5」Gnirts 10——题解
    洛谷P11487「CfzRound5」Gnirts10传送锚点摸鱼环节「CfzRound5」Gnirts10题目背景Englishstatement.YoumustsubmityourcodeattheChineseversionofthestatement.InMemoryof\(\text{F}\rule{66.8px}{6.8px}\).题目描述题面还是简单一点好。给定......
  • 题解:AT_abc386_d [ABC386D] Diagonal Separation
    分析题面,发现题目求的是是否存在一个白点被\((1,1)\)和任意一个黑点围成的矩形内。先将所有黑点按\(x\)坐标排序。枚举所有的白点。找到所有横坐标不比该白点横坐标小的所有黑点的纵坐标的最大值所属点。如果该点的纵坐标小于该白点的纵坐标:(蓝点代表题目中的白点,红点......
  • 百丽宫24年春季真题题解——回型字符的打印
    不妨参考之前的一道选做题思路(虽然楼主自己之前也没找到时间做)但当时瞟过一眼题目,个人认为可以一起做,都是你中有我的关系,思路很相似。选做题摘录——晕:看着这样的"回”形图案你晕吗?让我们不用数组,来做出它。输入格式:n。正方形的边长输出格式:"%3d"   边长为n的数字回......