题解 P5329 【[SNOI2019]字符串】
用栈的做法来水一发。
首先我们有一个暴力的做法,枚举每个被删除的字符,然后排序输出,时间复杂度:$ O ( N \times N \times LogN ) $ 。
然后我们观察一下数据,发现有一个数据点且任意两个相邻字符 $ a_i $ 与 $ a_{i+1} $ 不相等;那么我们考虑这样一个字符串: $ acdedc $ 。比如现在我们比较去掉第三位的字符串和去掉第四位的字符串。我们发现 $ acddc $ 比 \(acdec\) 小,然后我们再发现除 $ 3,4 $ 位的以外的都是一样的,所以直接比较第三位第四位就可以啦。现在就是要考虑去掉当前位置如何与前面所有的字符串比较。我们发现一旦去掉第二位比第三位来的大那么后面不管去掉哪一位都不可能超过第二位。同理如果当前这一位比不过后一位的话,接下来的所有位他都比不过,就可以直接输出了。 所以我们把后面所有字符串都打不过的位置用栈记下来,把后面所有字符串都打得败的直接输出,这样我们就又多了 \(20\) 分的好成绩。
现在我们考虑有相邻有重复的情况,显然我们可以把相邻一样的区间看成一个字母来做,这样就可以 $ O( N ) $ 实现。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<stack>
#define INF 1LL<<62;
#define ll long long
#define For(X,From,To) for(ll X=From;X<=To;X++)
using namespace std;
const int MAXN=1e6+5;
char Str[MAXN];
ll N,Cnt,Ans[MAXN],Last,S[MAXN];
bool Flag;
ll QP(ll B,ll K){ ll Ans=1;for(;K;K>>=1) Ans*=(K%2)*B;return Ans;}
template<class T>void Read(T &X){
X=0;int F=0;char Ch=getchar();
while(Ch<'0' || Ch>'9'){ F|=(Ch=='-');Ch=getchar();}
while(Ch>='0' && Ch<='9'){ X=X*10+(Ch^48);Ch=getchar();}
X=F? -X:X;
}
template<typename T>
inline void Write(T X){
if(X<0){
putchar('-');
X=-X;
}
if(X>9) Write(X/10);
putchar((X%10)^48);
}
int main(){
Read(N);
scanf("%s",Str+1);
Last=1;//用Last来记录一段区间一样的字母的最左端,初始是最左端。
For(i,2,N)
if(Str[Last]>Str[i]){//一旦这个区间不如当前的字母,那么后面所有的字符串都可以打败他,所以可以直接输出。
for(int j=Last;j<i;j++){
Write(j);putchar(' ');
}
Last=i;
}else
if(Str[Last]<Str[i]){//否则后面就没有字母可以打败他,加入到栈里。
for(int j=i-1;j>=Last;j--) S[++Cnt]=j;
Last=i;
}
for(int i=Last;i<=N;i++){//最后还剩一个区间别忘了。
Write(i);putchar(' ');
}
while(Cnt){//输出栈里的所有元素。
Write(S[Cnt]);putchar(' ');
Cnt--;
}
return 0;
}//完美撒花。qwq
qwq
题解 P5329 【[SNOI2019]字符串】的更多相关文章
- [洛谷P5329][SNOI2019]字符串
题目大意:给一个长度为$n$的字符串$s$,字符串$p_i$为字符串$s$去掉第$i$个字符后形成的字符串.请给所有字符串$p_i$排序(相同字符串按编号排序) 题解:先去掉所有连续相同字符,因为它们 ...
- luogu P5329 [SNOI2019]字符串
传送门 显然要写一个排序,那只要考虑cmp函数怎么写就行了.第\(i\)个字符串和第 \(j\)个,首先前\(min(i,j)-1\)个字符是相同的,然后就是要比较后缀\(min(i,j)\)和\(m ...
- 洛谷$P5329\ [SNOI2019]$字符串 字符串
正解:字符串 解题报告: 传送门$QwQ$ 有两个很妙的方法,分别港下$QwQ$ 首先为了表示方便,这里和题面一样设$s_i$表示去掉第$i$个字母得到的字符串.另设$lcp(i,j)$表示$suf_ ...
- 【LOJ#3095】[SNOI2019]字符串(后缀数组)
[LOJ#3095][SNOI2019]字符串(后缀数组) 题面 LOJ 题解 首先画图看看如何比较两个串的大小,发现这个东西等价于求两个相邻的后缀的\(LCP\). 一个做法是求出\(SA\),然后 ...
- 洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速$dp\&Floyd$)
洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速\(dp\&Floyd\)) 标签:题解 阅读体验:https://zybuluo.com/Junl ...
- [SNOI2019]字符串
名称:字符串 来源:2019年陕西省选 题目内容 传送门 洛谷(P5392) 题目描述 给出一个长度为$n$的由小写字母组成的字符串$a$,设其中第$i$个字符为$a_i(1≤i≤n)$. 设删掉第$ ...
- 【题解】【字符串】【BFS】【Leetcode】Word Ladder
Given two words (start and end), and a dictionary, find the length of shortest transformation sequen ...
- HDU1004题解分析(字符串处理)
这道题是从上个星期开始做的,看到题时觉得似曾相似,好像做过,理了一下思路敲完代码又不对,后来发现是数组用错了,之后又重新想了数组和比较用法,昨天改了一个多小时,后来样例输出全部正确,所有情况都考虑到了 ...
- leetcode题解之分解字符串域名
1.题目描述 A website domain like "discuss.leetcode.com" consists of various subdomains. At the ...
随机推荐
- 硬肝4.4w字为你写成Java开发手册
先来看一下本篇文章的思维导图吧,我会围绕下面这些内容进行讲解.内容很干,小伙伴们看完还希望不吝转发.(高清思维导图版本关注作者公众号 Java建设者 回复 Java666 获取,其他思维导图获取方式在 ...
- ubuntu 1604升级到ubuntu 1804无法忽视的细节问题(亲测有效)
升级ubuntu系统,遇到很多问题,可能你在升级的时候也会碰到,希望对你有所帮助: 文章目录 1 常规升级过程 2 更改过源 3 无法全部更新 4 其他的问题 5 升级成功 6 无法进入gnome 6 ...
- go实现SnowFlake
package main import ( "errors" "fmt" "strconv" "sync" " ...
- iOS开发--性能调优记录
CPU VS GPU 关于绘图和动画有两种处理的方式:CPU(中央处理器)和GPU(图形处理器).但是由于历史原因,我们可以说CPU所做的工作都在软件层面,而GPU在硬件层面 对于图像处理,通常用硬件 ...
- 小程序-for循环遍历的使用
.js文件: Page({ /** * 页面的初始数据 */ data: { datas:[ { title: '提交申请', txt: '选择服务类型,填写基本信息,提交' }, { title: ...
- springBoot整合Spring-Data-JPA, Redis Redis-Desktop-Manager2020 windows
源码地址:https://gitee.com/ytfs-dtx/SpringBoot Redis-Desktop-Manager2020地址: https://ytsf.lanzous.com/b01 ...
- shell脚本命令 运行python文件&python命令行运行python代码
单独的python文件运行的时候 报错: 在shell脚本中,运行shell脚本命令:在Python命令行中,运行Python代码.然而,“python hello.py”是一个脚本命令,不是pyth ...
- 全网最全Docker命令详解
由于最近在学习Docker,在这里把有关Docker的命令做一个集合,方便后面查看: # docker --help Usage: docker [OPTIONS] COMMAND [arg...] ...
- php5.2安装memcached 扩展
需要注意版本号,好坑. libmemcached release 1.0.16 - installed from sourcephp-memcached release 2.1.0 - install ...
- Codeforces1144C(C题)Two Shuffled Sequences
C. Two Shuffled Sequences Two integer sequences existed initially — one of them was strictly increas ...