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 题解的更多相关文章

  1. [LeetCode] Is Subsequence 题解

    前言 这道题的实现方法有很多,包括dp,贪心算法,二分搜索,普通实现等等. 题目 Given a string s and a string t, check if s is subsequence ...

  2. Hdoj 1159.Common Subsequence 题解

    Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...

  3. CF1491A K-th Largest Value 题解

    Content 你有一个长度为 \(n\),并且仅包含 \(0/1\) 的数组 \(a\).现在对这个序列做以下两种操作之一共 \(q\) 次: \(1\) \(x\):将 \(a_x\) 修改为 \ ...

  4. 【AtCoder】AGC026 题解

    A - Colorful Slimes 2 找相同颜色的一段,然后答案加上段长除2下取整 代码 #include <iostream> #include <cstdio> us ...

  5. [Leetcode] Longest Palindromic Subsequence

    Longest Palindromic Subsequence 题解 题目来源:https://leetcode.com/problems/longest-palindromic-subsequenc ...

  6. LeetCode编程训练 - 折半查找(Binary Search)

    Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...

  7. 算法与数据结构基础 - 折半查找(Binary Search)

    Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...

  8. 算法与数据结构基础 - 贪心(Greedy)

    贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...

  9. [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总

    本文出自   http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner  打开 这个专题一共有25题,刷完 ...

  10. Longest Increasing Subsequences(最长递增子序列)的两种DP实现

    一.本文内容 最长递增子序列的两种动态规划算法实现,O(n^2)及O(nlogn).     二.问题描述 最长递增子序列:给定一个序列,从该序列找出最长的 升序/递增 子序列. 特点:1.子序列不要 ...

随机推荐

  1. volatile修饰全局变量,可以保证线程并发安全吗?

    今天被人问到volatile能不能保证并发安全? 呵,这能难倒我? 直接上代码: public class ThreadTest { // 使用volatile修饰变量 private static ...

  2. MaxKB web 站点知识库选择器的花样玩法

    背景:MaxKB 创建知识库支持"web 站点"的这种形式,但是很多同学不知道怎么录入选择器来针对性的获取某一部分内容. 1. 选择器作用 选择器用于定位网页中特定的元素,以便获取 ...

  3. 安装yml 与 wget

    一.备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...

  4. BI工具革命派vs传统强者:DataFocus.ai与Tableau的终极对决

    1. 摘要 DataFocus.ai 作为新一代商业智能工具,强调基于搜索的分析方式,旨在让业务用户能够轻松进行数据探索.该平台集成了数据仓库,并侧重于赋能非技术人员进行自助式分析.其核心理念是通过自 ...

  5. 解决React Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, ... useEffect cleanup function.

    在写react程序时遇到警告: Warning: Can't perform a React state update on an unmounted component. This is a no- ...

  6. C#——基于CancellationTokenSource实现Task的取消

    参照:第七节:利用CancellationTokenSource实现任务取消和利用CancellationToken类检测取消异常. - Yaopengfei - 博客园 (cnblogs.com) ...

  7. Ant Design Pro版中后台原型模板及Axure rplib元件库组件

    Ant Design Pro版中后台原型模板及Axure rplib元件库组件, Ant Design服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更 ...

  8. Map之“获取map中的key流转为List”

    一.获取map中的key转为List 注意 这里可以获取map中所有的key来转换为List, 这样后很多方案就不需要另外查询出来处理了 代码 @Test public void test() { M ...

  9. 完整版QQ(腾讯)开放平台操作指南(包含:qq登录能力获取等等)

    之前我和大家提过,我要购买第三方的APP服务,就相当于有自己的APP了,现在APP对接上线之前需要做大量的准备工作,在此把步骤分享给大家,这样可以节省大家很多时间. 完整版QQ(腾讯)开放平台操作指南 ...

  10. ModelForm验证实例

    程序目录 models.py from django.db import models# Create your models here.class UserType(models.Model):   ...