2021江苏省赛 H-Reverse the String

来源

题目

There is a string of lowercase letters, and you want to minimize its lexicographical order. What you can do is reverse an interval or do nothing.

For example, for the string abcdefg, if we reverse the interval abcdefg, it will become abfedcg.

A string aa is lexicographically smaller than a string bb if and only if one of the following holds:

  • aa is a prefix of bb, but a≠ba≠b.
  • In the first position where aa and bb differ, the string aa has a letter that appears earlier in the alphabet than the corresponding letter in bb

Input

The first line contains an integer TT (1≤T≤201≤T≤20), denoting the number of test cases.

For the following TT lines, each line contains a string ss of lowercase letters (1≤|s|≤1051≤|s|≤105, where |s||s| is the length of ss).

It is guaranteed that ∑|s|≤1.5×106∑|s|≤1.5×106 over all test cases.

Output

For each test case, output the string with the minimal lexicographical order in a single line.

题意

给定一个字符串,可以最多翻转任意区间一次。问能得到的字典序最小的字符串是什么。字符串的长度是1e5范围。

思路

       首先数据范围摆在这,枚举两个端点是不可接受的,最多只能枚举一个端点,所以应该是有一端可以固定。

        因为要做到字典序最小,所以我们先将字符串每个字符进行排序,从头往后看,如果当前的位置和排序后的字符串是相同的,说明这个位置已经是最优的情况,不需要翻转,如果出现第一个不是最优,那么后面必然有个字符能翻转上来使得至少在这个位置上是最优的,所以就可以贪心的选好翻转区间的左端点了。而且翻转区间右端点位置上的字符也可以确定下来。

       接着就是判断右边所有符合条件的端点哪个是最优的,这个必须得逐个判断,至少是O(n)的复杂度,还剩个log用于比较两种翻转哪个更优。可以二分判断两个字符串的公共前缀,具体的check函数就是检查前mid个字符的哈希值是否相同。然后找到第一位不同的进行比较。

      对k个可能的右端点,进行k-1次比较,然后输出答案即可。

#include<bits/stdc++.h>using namespace std;
const int N = 1e5+100;typedef unsigned long long ull;ull bas=13313;
char s[N],ss[N];
ull h1[N],h2[N];
ull a[N];
ull st;
vector<int>v;ull query1(ull l,ull r){return h1[r]-h1[l-1]*a[r-l+1];
}
ull query2(ull l,ull r){return h2[l]-h2[r+1]*a[r-l+1];
}
bool check(ull x,ull ed,ull ed2){ull hash1;if(st+x-1<=ed){hash1=query2(ed-x+1,ed);}else{hash1=query2(st,ed)*a[st+x-ed-1]+query1(ed+1,st+x-1);}ull hash2=query2(ed2-x+1,ed2);if(hash1==hash2)return true;else return false;
}
void solve(){cin>>s+1;ull n=strlen(s+1);a[0]=1;for(int i=1;i<=n;i++){h1[i]=h1[i-1]*bas+s[i]-'a'+1;a[i]=a[i-1]*bas;}for(int i=n;i>=1;i--){h2[i]=h2[i+1]*bas+s[i]-'a'+1;}for(int i=1;i<=n;i++){ss[i]=s[i];}ss[n+1]='\0';sort(ss+1,ss+n+1);st=0;char c;for(int i=1;i<=n;i++){if(ss[i]!=s[i]){st=i;c=ss[i];break;}}if(st==0){cout<<s+1<<'\n';return;}v.clear();for(int i=st;i<=n;i++){if(s[i]==c)v.push_back(i);}ull ed=v[0];for(int i=1;i<v.size();i++){ ull ed2=v[i];ull hash1=query2(st,ed)*a[ed2-ed]+query1(ed+1,ed2);ull hash2=query2(st,ed2);if(hash1==hash2)continue;ull l=0,r=ed2-st+1;while(l<r){ull mid=(l+r)/2;if(check(mid,ed,ed2))l=mid+1;else r=mid;}if(st+l-1<=ed){if(s[ed-l+1]>s[ed2-l+1])ed=ed2;}else{if(s[st+l-1]>s[ed2-l+1])ed=ed2;}}for(int i=1;i<st;i++){cout<<s[i];}for(int i=ed;i>=st;i--){cout<<s[i];}for(int i=ed+1;i<=n;i++){cout<<s[i];}cout<<'\n';
}int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t = 1;cin>>t;while (t--)solve();
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

017、Python+fastapi,第一个Python项目走向第17步:ubuntu24.04 无界面服务器版下安装nvidia显卡驱动

一、说明 新的ubuntu24.04正式版发布了&#xff0c;前段时间玩了下桌面版&#xff0c;感觉还行&#xff0c;先安装一个服务器无界面版本吧 安装时有一个openssh选择安装&#xff0c;要不然就不能ssh远程&#xff0c;我就是没选&#xff0c;后来重新安装ssh。 另外一个就是安…

数据仓库和数据仓库分层

一、数据仓库概念 数据仓库(Data Warehouse)&#xff0c;可简写为DW或DWH。数据仓库&#xff0c;是为企业所有级别的决策制定过程&#xff0c;提供所有类型数据支持的战略集合。它是单个数据存储&#xff0c;出于分析性报告和决策支持目的而创建。 为需要业务智能的企业&#…

CGAL 点云数据生成DSM、DTM、等高线和数据分类

原文链接 CGAL 点云数据生成DSM、DTM、等高线和数据分类 - 知乎 在GIS应用软件中使用的许多传感器(如激光雷达)都会产生密集的点云。这类应用软件通常利用更高级的数据结构&#xff1a;如&#xff1a;不规则三角格网 (TIN)是生成数字高程模型 (DEM) 的基础&#xff0c;也可以利…

2024深圳杯数学建模竞赛A题(东三省数学建模竞赛A题):建立火箭残骸音爆多源定位模型

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓&#xff08;浏览器打开&#xff09; https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 2024深圳杯数学建模竞赛A题&#xff08;东三省数学建模竞赛A题&#xff0…

PyVista 3D数据可视化 Python 库 简介 含源码

Pyvista是一个用于科学可视化和分析的Python库 &#xff1b;我认为它适合做一些网格数据的处理&#xff1b; 它封装了VTK&#xff08;Visualization Toolkit&#xff09;之上&#xff0c;提供了一些高级接口&#xff0c; 3D数据可视化变得更加简单和易用。 1.安装 pyvista&…

开发一个语音聊天社交app小程序H5需要多少钱?

社交&#xff0c;即时通讯APP系统。如何开发一个社交App||开发一个即时通信应用是一项复杂而充满挑战的任务&#xff0c;需要考虑多个技术、开发时间和功能方面的因素。以下是一个概要&#xff0c;描述了从技术、开发时间和功能角度如何开发这样的应用&#xff1a; 1. 技术要点…

12、Flink 的 Keyed State 代码示例

1、KeyedState 用例 import org.apache.flink.api.common.functions.AggregateFunction; import org.apache.flink.api.common.functions.ReduceFunction; import org.apache.flink.api.common.state.*; import org.apache.flink.api.common.typeinfo.TypeHint; import org.ap…

70.网络游戏逆向分析与漏洞攻防-角色与怪物信息的更新-整理与角色数据更新有关的数据

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

基于python的舞蹈经验分享交流网站django+vue

1.运行环境&#xff1a;python3.7/python3.8。 2.IDE环境&#xff1a;pycharmmysql5.7/8.0; 3.数据库工具&#xff1a;Navicat11 4.硬件环境&#xff1a;windows11/10 8G内存以上 5.数据库&#xff1a;MySql 5.7/8.0版本&#xff1b; 运行成功后&#xff0c;在浏览器中输入&am…

新唐的nuc980/nuc972的开发3-官方源码编译

上一节中bsp已经安装&#xff0c;交叉环境已经搭建&#xff0c;理应就可以正常的编写上层的应用程序啦。 但是系统启动次序是- uboot-> kernel内核 ->挂载文件系统 ->上层应用程序 下面是bsp安装后的文件&#xff1a; 因此本章节&#xff0c;将讲解 uboot-> kerne…

Ubuntu Linux完全入门视频教程

Ubuntu Linux完全入门视频教程 UbuntuLinux完全入门视频教程1.rar UbuntuLinux亮全入门视频教程10.ra UbuntuLinux亮全入门视频教程11.ra UbuntuLinux完全入门视频教程12.ra UbuntuLinux亮全入门视频教程13.ra UbuntuLinux完全入门视频教程14.rar UbuntuLinux完全入门视频教程…

刷代码随想录有感(51):从中序和后序前序和中序构造二叉树

中后题干&#xff1a; 第一步&#xff1a;如果数组大小为零的话&#xff0c;说明是空节点了。 第二步&#xff1a;如果不为空&#xff0c;那么取后序数组最后一个元素作为节点元素。 第三步&#xff1a;找到后序数组最后一个元素在中序数组的位置&#xff0c;作为切割点 第四…

es5中的类和静态方法、继承详解

1、关于es5 es5中的类 // 1、最简单的类function Person() {this.name "姓名";this.age 20;}let p new Person();console.log(p.name);// 2、构造函数和原型链里面增加方法function Person() {this.name "姓名"; // 属性this.age 20;this.run f…

Large Language Models for Test-Free Fault Localization

基本信息 这是24年2月发表在ICSE 24会议&#xff08;CCF A&#xff09;的一篇文章&#xff0c;作者团队来自美国卡内基梅隆大学。 博客创建者 武松 作者 Aidan Z.H. Yang&#xff0c;Claire Le Goues&#xff0c;Ruben Martins&#xff0c;Vincent J. Hellendoorn 标签 …

自制英语听力视频 5.1

breaking news&#xff1a;突发新闻 judge&#xff1a;法官 hush money&#xff1a;封口费 trial&#xff1a;审判 violated:违反 gag order&#xff1a;禁言令 the judge has ruled the former president has violated a gag order&#xff1a;法官裁定前总统违反了禁言…

启明云端2.4寸屏+ESP32-S3+小型智能调速电动家用除草机案例 触控三档调速,能显示电压故障码

今天给大家分享个启明云端2.4寸屏ESP32-S3小型智能调速电动家用除草机案例&#xff0c;国外有草坪文化&#xff0c;这个机器能智能触控三档调速&#xff0c;带屏能显示电压故障码&#xff0c;数显档位&#xff08;3档最大&#xff09;&#xff0c;触控屏&#xff0c;长按3秒就能…

使用 langchain 连接 通义千问 并用 fastApi 开放接口

安装 langchain 方法 https://www.cnblogs.com/hailexuexi/p/18087602 安装 fastapi fastapi 是一个用于构建高性能 Web 应用的 Python 框架&#xff0c;它提供了简洁、高效的 API 开发体验。 pip install fastapi 安装 uvicorn uvicorn 是一个用于运行 FastAPI 应用的服务…

C语言学习/复习37--进阶总结与题目练习

一、题目练习 1. 循环与无符号char的取值范围 注意事项&#xff1a;0~255 -128~127 char类的取值范围看做循环图 2.ASCLL值与循环 3.按位操作与bit位 4 .结构体的大小 注意事项&#xff1a;结构体嵌套结构体的大小计算 5.循环条件 6.数据类型与原反补码 7.指针访问字符串数…

react18子组件设置接收默认值和值类型验证

父组件传值 import ChildCom from ./components/ChildCom export default function Person {return(<div><ChildCom name"alan-ben" age{18} score{[98, 97, 100]} /></div>) } 子组件接收并验证类型 import React from react import PropTypes…

CentOS-Stream-9配置网络和web控制台cockpit

vim /etc/NetworkManager/system-connections/ens33.nmconnection&#xff0c;修改autoconnectiontrue自动连接网络&#xff0c;可以自动获取IP地址&#xff0c;或者设置固定IP地址&#xff0c;在[ipv4]下面编辑methodmanual和address1192.168.4.111/24,192.168.4.1和dns223.5.…