CF1905C Largest Subsequence 题解
首先考虑如何生成一个字典序最大的子序列。我们先考虑找到字符串中的最大元素,然后在其之后找到第二大的元素,重复这个过程,直到达到序列末尾。
我们可以通过记录每种字母的出现位置,从大往小枚举。每碰到一个字母在当前位置之后,将这个字母加入序列,并将当前位置修改为这个位置。
容易发现,最后的操作一定是对于初始字符串中字典序最大的子序列进行多次移位操作。
因为一次移位之后,最大字符只是被移向该子序列后一位,除去被移走的元素,下一次操作的字符集没有改变,一定是初始字符串中字典序最大的子序列的子序列。而根据生成方式,被移走的元素字典序靠后,故字典序偏小,被移到前面没有坏处,故不需要第二次移动。所以,我们可以看做每次操作最初的序列,已经移到开头的较小元素不再被移动。
因此,我们只考虑操作最初的子序列。根据生成方式,在这个子序列中,较小的元素靠后,所以为了消除所有逆序对,我们需要把最大的元素移动的最后。
注意并不一定是要把第一个元素移动到最后,因为可能会存在多个相同的元素,只要其中一个移动到序列末尾即可,再移动没有意义。
根据上述移动方式,序列中最小的元素一定移动到开头,最大的元素一定移动到末尾。我们直接记录这个序列,然后翻转即可。
操作结束后,直接判定是否存在逆序对即可。顺序遍历序列,记录遍历过的最大值,如果现在的元素小于最大值,证明存在逆序对,无解。
总体时间复杂度 \(O(n)\)。
#include <bits/stdc++.h>
using namespace std;
long long t,n,cnt,now,cw[300000],cv[300000];
char s[300000];
vector<long long>w[30];
int main()
{
scanf("%lld",&t);
while(t--)
{
long long ans=0;
cnt=0,now=0;
scanf("%lld",&n);
scanf("%s",s+1);
for(int i=1;i<=26;i++)w[i].clear();
for(int i=1;i<=n;i++)w[s[i]-'a'+1].push_back(i);
for(int i=26;i>=1;i--)
{
long long l=w[i].size();
for(int j=0;j<l;j++)
if(w[i][j]>now)now=w[i][j],cw[++cnt]=w[i][j],cv[cnt]=i;
}
ans=cnt-1;
while(cv[cnt-ans]==cv[1]&&ans>=0)ans--;
ans++;
for(int i=1;i<=cnt;i++)s[cw[i]]='a'+cv[cnt-i+1]-1;
now=0;
for(int i=1;i<=n;i++)
if(s[i]-'a'+1>=now)now=s[i]-'a'+1;
else
{
ans=-1;
break;
}
printf("%lld\n",ans);
}
return 0;
}
CF1905C Largest Subsequence 题解的更多相关文章
- [LeetCode] Is Subsequence 题解
前言 这道题的实现方法有很多,包括dp,贪心算法,二分搜索,普通实现等等. 题目 Given a string s and a string t, check if s is subsequence ...
- Hdoj 1159.Common Subsequence 题解
Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...
- CF1491A K-th Largest Value 题解
Content 你有一个长度为 \(n\),并且仅包含 \(0/1\) 的数组 \(a\).现在对这个序列做以下两种操作之一共 \(q\) 次: \(1\) \(x\):将 \(a_x\) 修改为 \ ...
- 【AtCoder】AGC026 题解
A - Colorful Slimes 2 找相同颜色的一段,然后答案加上段长除2下取整 代码 #include <iostream> #include <cstdio> us ...
- [Leetcode] Longest Palindromic Subsequence
Longest Palindromic Subsequence 题解 题目来源:https://leetcode.com/problems/longest-palindromic-subsequenc ...
- LeetCode编程训练 - 折半查找(Binary Search)
Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...
- 算法与数据结构基础 - 折半查找(Binary Search)
Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...
- 算法与数据结构基础 - 贪心(Greedy)
贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...
- [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总
本文出自 http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner 打开 这个专题一共有25题,刷完 ...
- Longest Increasing Subsequences(最长递增子序列)的两种DP实现
一.本文内容 最长递增子序列的两种动态规划算法实现,O(n^2)及O(nlogn). 二.问题描述 最长递增子序列:给定一个序列,从该序列找出最长的 升序/递增 子序列. 特点:1.子序列不要 ...
随机推荐
- 在 MySQL 中建索引时需要注意哪些事项?
在 MySQL 中建索引时需要注意哪些事项 索引在 MySQL 中是提升查询性能的关键,但不当的索引设计可能会导致性能下降或资源浪费.因此,在建索引时需要综合考虑性能.存储成本和业务需求. 1. 确定 ...
- OpenEuler22.03源码编译安装nginx1.24.0
一.环境说明 操作系统版本:OpenEuler22.03 SP2 LTS Nginx版本:1.24.0 安装位置:/app/nginx Selinux配置:关闭或设置为permissive 二.Ngi ...
- 海康摄像头SDK在Linux、windows下的兼容问题
零.前言 最近一直在做人脸识别相关的应用. 主要就是使用海康的摄像头抓拍.录制视频,使用虹软的sdk进行人脸识别,使用jna调用这些sdk. 海康的sdk在使用时遭遇了很多问题,主要问题就是windo ...
- Python 潮流周刊#99:如何在生产环境中运行 Python?(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 凯亚IOT平台在线测试MQTT接入设备
一.概述 凯亚 (Kayak)开通了MQTT端口425,以便给感兴趣的同僚进行测试,下面将在此篇文章讲解如何平台接入设备进行MQTT通信 凯亚 (Kayak) 是什么? 凯亚(Kayak)是基于.NE ...
- AD 侦查-MSRPC Over SMB
本文通过 Google 翻译 AD Recon – MSRPC Over SMB (135/139/445) 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 0 ...
- Spring Boot 不能加载 tcnative-2.dll 库(Can't load library: tcnative-2.dll)
Spring Boot 不能加载 tcnative-2.dll 库 本文将介绍怎样解决 Spring Boot 在启动时抛出 "org.apache.tomcat.jni.LibraryNo ...
- HarmonyOS Next开发教程之地图定位
今天分享一下在鸿蒙开发中的地图定位问题,也就是在地图中如何定位自己所在的位置. 关于如何加载显示地图在之前的文章已经详细介绍过,有问题的友友可以点击查看: HarmonyOS NEXT实战教程-实现K ...
- Python 3.14 新特性盘点,更新了些什么?
Python 3.14.0 稳定版将于 2025 年 10 月正式发布,目前已进入 beta 测试阶段.这意味着在往后的几个月里,3.14 的新功能已冻结,不再合入新功能(除了修复问题和完善文档). ...
- Go 层级菜单树转 json 处理
本篇是一个补充知识点, 目的是为了下篇的后台管理系统中, 菜单权限的接口进行铺垫一下. 同时也是做个笔记, 因为在很多地方都会用这种 "树结构" 来实现很多权限, 层级, 菜单的处 ...