题解 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 ...
随机推荐
- 新书《OpenShift云原生架构:原理与实践》第一章第三节:企业级PaaS平台OpenShift
近十年来,信息技术领域在经历一场技术大变革,这场变革正将我们由传统IT架构及其所支撑的臃肿应用系统时代,迁移至云原生架构及其所支撑的敏捷应用系统时代.在这场变革中,新技术的出现.更新和淘汰之迅速,以及 ...
- Day_12【集合】扩展案例3_产生10个长度为10,不能重复,由数字0-9,小写字母和大写字母组成的字符串
分析以下需求,并用代码实现 1.产生10个1-20之间的随机数要求随机数不能重复 2.产生10个长度为10的不能重复的字符串(里面只能出现大写字母.小写字母.0-9的数字),并遍历打印输出 代码 pa ...
- Android 电池管理系统架构总结 Android power and battery management architecture summaries
文章目录 1 整体架构 2 设计构架 2.1 driver 2.1.1 Charger.ko 2.1.2 Battery.ko 2.2 power supply 2.2.1 基础架构 2.2.2 代码 ...
- [poj2778 DNA Sequence]AC自动机,矩阵快速幂
题意:给一些字符串的集合S和整数n,求满足 长度为n 只含charset = {'A'.'T‘.'G'.'C'}包含的字符 不包含S中任一字符串 的字符串的种类数. 思路:首先对S建立ac自动机,考虑 ...
- loadrunner Error -27985问题
错误提示:Error -27985: There is no context for HTML-based functions. A previous function may not have us ...
- Docker搭建代码检测平台SonarQube并检测maven项目
1 前言 良好的代码习惯是一个优秀程序员应该具备的品质,但靠人的习惯与记忆来保证代码质量,始终不是一件靠谱的事.在计算机行业应该深知,只要是人为的,都会有操作风险.本文讲解如何通过Docker搭建代码 ...
- xml rpc SimpleXMLRPCServer [python]
SimpleXMLRPCServe 其实里面xml的概念不是很强,主要是rpc !不用关心什么xml . rpc 是就是远程调用,把函数什么的放到远程服务器上,本地调用就行了.用 SimpleXMLR ...
- 【遗传编程/基因规划】Genetic Programming
目录 背景介绍 程序表示 初始化 (Initialization) Depth定义 Grow方法 Full方法 Ramped half-and-half方法 适应度(Fitness)与选择(Selec ...
- P3366【模板】最小生成树
P3366[模板]最小生成树 Kruskal #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ; ...
- Maven整合JaCoCo和Sonar,看看你的测试写够了没
1 简介 单元测试是保证代码质量的重要一环,而如何衡量单元测试写得好不好呢?覆盖率(Coverage)是一个重要指标.而JaCoCo则是专门为Java提供的用于检测测试覆盖率的工具,英文全称为Java ...