用栈的做法来水一发。

首先我们有一个暴力的做法,枚举每个被删除的字符,然后排序输出,时间复杂度:$ 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

最新文章

  1. BPM配置故事之案例11-操作外部数据源
  2. SQL Server的镜像是基于物理块变化的复制 镜像Failover之后数据的预热问题
  3. android应用程序中获取view 的位置
  4. [GeekBand] C++学习笔记(2)——BigThree、OOP
  5. java 服务治理办法
  6. Windows7 x64 编译Dlib库
  7. Beautiful Dream hdu3418 (直接做或二分)
  8. django框架 - 实时查看执行的sql语句
  9. A_B_Good Bye 2018_cf
  10. Python模块安装与读取Excel
  11. Typescript日期Date如何做格式化字符串
  12. Java岗 面试考点精讲(基础篇01期)
  13. phonegap-plugin-contentsync
  14. 公开的免费WebService接口分享
  15. rabbitmq安装与高可用集群配置
  16. 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)
  17. 查询EBS系统在线人数
  18. Gym - 101628F Find the Inn dijkstra,读边时计算新权值
  19. 15款Cocos2d-x游戏源码
  20. 在循环中使用鼠标悬停时表示当前悬停选中,传入this关键字即可

热门文章

  1. 谈谈Spring中的BeanPostProcessor接口
  2. Day_08【面向对象】扩展案例3_使用多态的形式创建缉毒狗对象,调用缉毒方法和吼叫方法
  3. 安卓集成Unity开发示例(一)
  4. Excel函数有门槛,是编程
  5. springBoot整合Spring-Data-JPA, Redis Redis-Desktop-Manager2020 windows
  6. [hdu4358]树状数组
  7. JS理论-跨域解决方案
  8. 一句话+两张图搞定JDK1.7HashMap,剩下凑字数
  9. shell脚本命令 运行python文件&amp;python命令行运行python代码
  10. 深入Spring之IOC之加载BeanDefinition