【每日一题】—— C. Largest Subsequence(Codeforces Round 915 (Div. 2))(规律、字符串处理)

🌏博客主页:PH_modest的博客主页
🚩当前专栏:每日一题
💌其他专栏:
🔴 每日反刍
🟡 C++跬步积累
🟢 C语言跬步积累
🌈座右铭:广积粮,缓称王!

一.题目描述

在这里插入图片描述

题目大意:


给定的是长度为 n n n 的字符串 s s s 。只需进行一次操作,就可以选取字符串 s s s 的词性最大的 † ^\dagger 子序列,并将其向右循环移动 ‡ ^\ddagger

你的任务是计算 s s s 达到排序所需的最少操作次数,或者报告它从未达到排序状态。

† ^\dagger 当且仅当以下条件之一成立时,字符串 a a a 在词法上比字符串 b b b 小:

  • a a a b b b 的前缀,但 a ≠ b a \ne b a=b
  • a a a b b b 不同的第一个位置,字符串 a a a 的字母在字母表中出现的时间早于 b b b 中的相应字母。

‡ ^\ddagger 将字符串 t 1 t 2 … t m t_1t_2\ldots t_m t1t2tm 向右循环移动,就得到了字符串 t m t 1 … t m − 1 t_mt_1\ldots t_{m-1} tmt1tm1


题目链接:

C. Largest Subsequence(Codeforces Round 915 (Div. 2))

二.思路分析

这题只需要知道几个点就可以了

  • 循环移动之后会产生什么效果?
    在这里插入图片描述
    不难看出操作完之后序列是和原本的序列中心对称的,可以将该操作看成对称交换操作,这是一个重要的点
  • 第二点是交换的次数的规律:次数=最大序列总数 - 最大字母数
  • 之后就是按照对称的规律进行字母的交换,交换的方法有很多,我这边用的是双端队列来存储最大序列,再定义一个v数组存放他们的下标以便访问,具体的操作可以看代码理解一下,还可以用vector数组来进行操作,方法不唯一
  • 交换完之后再判断一下现在的字符串是否是非递减的

注意点:我觉得这题代码实现唯一的难点就是找出最大序列,这边需要使用while循环来进行判断,而不能仅仅使用if语句

三.代码展示

//https://codeforces.com/contest/1905/problem/C
//
//
#include<iostream>
#include<algorithm>
#include<string>
#include<deque>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<cstring>
#define int long long
using namespace std;

deque<char>dq;//存放最大序列
int v[200020];//存放最大序列的下标

void solve()
{
	dq.clear();
	memset(v,0,sizeof(v));
    int n;
    cin>>n;
    string s;
    cin>>s;
    int flag=0;
    //判断一下原序列是否是有序的
    for(int i=1;i<s.size();i++)
	{
		if(s[i]<s[i-1])
		{
			flag=1;
		}
	}
	if(flag==0)
	{
		cout<<"0"<<"\n";
		return;
	}
	
    int r=0;
    //找出最大序列
    for(int i=0;i<s.size();i++)
    {
		//注意用循环
    	while(!dq.empty()&&dq.back()<s[i])//如果之前插入的字母小于现在准备插入的字母就删除之前插入的字母
    	{
    		dq.pop_back();
    		r--;
		}
		dq.push_back(s[i]);
		v[r++]=i;
	}
	
	int nummax=1;//记录最大序列中最大字母的个数
	for(int i=1;i<r;i++)
	{
		if(s[v[i]]==s[v[i-1]])
		{
			nummax++;
		}
		else
		{
			break;
		}
	}
	
	int ans=r-nummax;//操作次数=字母总个数-最大字母个数
	//操作完之后的序列
	for(int i=0;i<r/2;i++)
	{
		char tmp=s[v[i]];
		s[v[i]]=s[v[r-i-1]];
		s[v[r-i-1]]=tmp;
	}
	//判断操作完是否是非递减排序
	for(int i=1;i<s.size();i++)
	{
		if(s[i]<s[i-1])
		{
			cout<<"-1"<<"\n";
			return;
		}
	}
	cout<<ans<<"\n";
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

最后:

每日一题系列旨在养成刷题的习惯,所以对代码的解释并不会特别详细,但足够引导大家写出来,选的题目都不会特别难,但也不是特别简单,比较考验大家的基础和应用能力,我希望能够将这个系列一直写下去,也希望大家能够和我一起坚持每天写代码。

之后每个星期都会不定期更新codeforces和atcoder上的题目,想要学习算法的友友们千万别错过了,有什么疑问欢迎大家在评论区留言或者私信博主!

在这里送大家一句话:广积粮,缓称王!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/255650.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Postman使用总结--关联

当接口和接口之间&#xff0c;有依赖关系时&#xff0c;需要借助 postman 关联技术来实现

计算机组成原理——数据的表示与运算2

D n位定点整数包括1位符号位&#xff0c;n-1位数值位。因此当符号位为0&#xff0c;表示为正数时&#xff0c;数值位全为1&#xff0c;是最大值。例如n5&#xff0c;那么01111是最大值&#xff0c;最大值是15。 111110000-12^4-1 最小值只要符号位取1即可&#xff0c;所以最…

福德植保无人机工厂:创新科技与绿色农业的完美结合

亲爱的读者们&#xff0c;欢迎来到福德植保无人机工厂的世界。这里&#xff0c;科技与农业的完美结合为我们描绘出一幅未来农业的新篇章。福德植保无人机工厂作为行业的领军者&#xff0c;以其领先的无人机技术&#xff0c;创新的理念&#xff0c;为我们展示了一种全新的农业服…

超级计算机与天气预报:精准预测的科技革命

超级计算机与天气预报&#xff1a;精准预测的科技革命 一、引言 随着科技的飞速发展&#xff0c;超级计算机已经成为现代社会不可或缺的一部分。它们在科研、工业、军事等领域发挥着重要作用&#xff0c;其中天气预报是一个颇具代表性的应用领域。本文将探讨超级计算机在天气…

VueDraggablePlus - 免费开源的 Vue 拖拽组件,支持 Vue2 / Vue3,还被尤雨溪推荐了

今天在网上看到尤雨溪推荐的这款拖拽组件&#xff0c;试了一下非常不错&#xff0c;同样推荐给大家。 VueDraggablePlus 是一个专为 Vue 打造的拖拽排序模块&#xff0c;基于 Sortablejs 封装&#xff0c;支持 Vue3 或 Vue 2.7&#xff0c;本月的 21 日&#xff0c;Vue 作者尤…

钡铼无线R10A工业级路由器在工业机器人领域的创新应用

随着工业机器人的普及&#xff0c;对于高可靠性和高稳定性的网络接入设备的需求也越来越大。传统的有线网络虽然稳定&#xff0c;但在现场布置和维护上面临很多困难&#xff0c;而无线网络虽然方便&#xff0c;但受到信号干扰和传输距离限制等问题的影响。如何解决这些问题&…

word增加引用-endnote使用

使用软件&#xff1a; web of science https://webofscience.clarivate.cn/wos/alldb/basic-search; Pub Med等数据库endnote20 链接: https://pan.baidu.com/s/1VQMEsgFY3kcpCNfIyqEjtQ?pwdy1mz 提取码: y1mz 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --…

Hadoop Single Node Cluster的安装

Hadoop Single Node Cluster的安装 安装JDK查看java -version更新本地软件包安装JDK查看java安装位置 设置SSH无密码登录安装hadoop下载安装设置hadoop环境变量修改hadoop配置设置文件设置core-site.xml设置YARN-site.xml设置mapred-site.xml设置HDFS分布式文件系统创建并格式化…

新增工具箱管理功能、重构网站证书管理功能,1Panel开源面板v1.9.0发布

2023年12月18日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.9.0版本。 在这一版本中&#xff0c;1Panel引入了新的工具箱管理功能&#xff0c;包含Swap分区管理、Fail2Ban管理等功能。此外&#xff0c;1Panel针对网站证书管理功能进行了全面重构&…

小程序自定义轮播图样式

小程序自定义轮播图样式以下是各案例&#xff0c;仅供大家参考。 效果展示&#xff1a; index.wxml代码&#xff1a; <view><!-- 轮播 --><view><swiper indicator-dots"{{indicatorDots}}"autoplay"{{autoplay}}" interval"{{…

初识迭代器(Iterator)——迭代器模式——迭代加深(后续更新...)

学习网页&#xff1a; Welcome to Python.orghttps://www.python.org/ 迭代器&#xff08;Iterator&#xff09; 迭代器是一个非常有用的Python特性&#xff0c;它允许我们遍历一个容器&#xff08;如列表、元组、字典、集合等&#xff09;的元素。迭代器提供了一种方法&…

OpenHarmony应用开发环境搭建指南

OpenHarmony的应用开发主要是基于Deveco Studio&#xff08;目前只支持Windows及Mac平台&#xff09;搭配相应的SDK进行&#xff0c;现对开发环境的搭建进行说明。 1:Deveco下载安装 下载对应平台的安装包即可。接下来以Windows平台为例&#xff0c;进行开发环境的搭建。 下载…

我做了一个在手机灵动岛锁屏看实时网速/步数/下班倒计时/跑步距离/照片/待办/倒计时/手机使用次数/帧率...的软件

我做了一个在手机灵动岛&锁屏看实时网速/步数/下班倒计时/跑步距离/照片/待办/倒计时/手机使用次数/帧率…的软件 Island Widgets 的作用&#xff1a; 提醒您 &#xff1a; 准时下班每天运动陪伴家人保持体重放下手机每日待办当前网速手机使用强度实时热搜现在天气… 初…

小米与魅族:竞争中的创新之路

导言 小米与魅族作为中国智能手机领域的两大明星企业&#xff0c;一直在激烈的竞争中谋求创新突破。本文将深入探讨这两家公司在产品、市场和创新方面的竞争与合作&#xff0c;揭示它们在快速发展的移动科技行业中的发展轨迹。 1. 产品创新与竞争 小米的性价比…

Redis查看当前连接情况client list

Redis Client List 命令用于返回所有连接到服务器的客户端信息和统计数据。 redis 127.0.0.1:6379> CLIENT LIST 返回值 addr &#xff1a; 客户端的地址和端口 fd &#xff1a; 套接字所使用的文件描述符 age &#xff1a; 以秒计算的已连接时长 idle &#xff1a; 以秒计算…

mysql 21day yum安装数据库

目录 mysql下载官网下载mysql 源进入mysql 官网 yum安装mysql先安装mysql 源检查源修改安装版本方法一方法二 安装命令 mysql使用启动&开机启动查看密码修改密码登录数据库 mysql下载官网 https://dev.mysql.com/doc/ 链接: 点击进入mysql官网 下载mysql 源 进入mysql 官…

智能优化算法应用:基于吉萨金字塔建造算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于吉萨金字塔建造算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于吉萨金字塔建造算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.吉萨金字塔建造算法4.实验参…

app上架-.您的应用在首次打开或运行中,未见使用权限对应的相关功能或服务时,提前向用户弹窗申请开启【已安装应用列表】权限,不符合华为应用市场审核标准。

上架提示 您的应用在首次打开或运行中&#xff0c;未见使用权限对应的相关功能或服务时&#xff0c;提前向用户弹窗申请开启【已安装应用列表】权限&#xff0c;不符合华为应用市场审核标准。 测试步骤&#xff1a;首次打开APP&#xff0c;在首页页面&#xff0c;非服务所必须…

任务十六:主备备份型防火墙双机热备

目录 目的 器材 拓扑 步骤 一、基本配置 配置各路由器接口的IP地址【省略】 1、配置BGP协议实现Internet路由器之间互联 2、防火墙FW1和FW2接口IP配置与区域划分 3、配置区域间转发策略 4、配置NAPT和默认路由 5、配置VRRP组&#xff0c;并加入Active/standby VGMP管…

Axure的交互与情形,事件,动作

交互样式 交互样式是指当用户与原型进行交互时&#xff0c;元素所呈现出的视觉效果。在Axure中&#xff0c;可以通过设置交互样式来调整元素在交互过程中的外观&#xff0c;例如改变颜色、大小、位置等。 交互事件 交互事件是指在用户与原型进行交互时触发的动作。在Axure中&…