当前位置: 首页 > news >正文

牛客周赛 66 F 小苯的字符提前

原题链接:F-小苯的字符提前

题意:给出长度为n的字符串,定义move(i)串为将第i个字母移到首位的字符串,对于move(1)到move(n)的字符串,求出字典序第k小的move串。

思路:思维题。第一步,可以将move串分成26类,每一类为不同的小写字符开头,这样就可以确定字典序第k小的move串以什么字符开头。第二步,观察这些move串的特点,可以发现开头字母确定的情况下,这些串的字典序和第i个字符之后第一个不同的字符的大小有关。

如果第一个不同的字符比第i个字符小,那么i之后的move串的字典序都会大于当前串。例如:aababc,move(3)=baaabc,move(5)=baabac,可以发现b>a,如果移动3之后的b,会让3位置的b掉到4位置,move(3)和move(5)相比四位置的a<b,所以3位置之后全部的b都会在4位置上小于a,那么就可以确定move(3)的字典序小于后面全部的。

如果第一个不同的字符比第i个字符大,那么i之后的move串的字典序都会小于当前串。例如:aabcba,move(3)=baacba,move(5)=baabca,可以发现c>b,如果移动3之后的b,会让3位置的b掉到4位置,move(3)和move(5)相比4位置的c>b,所以3位置之后全部的b都会在4位置上小于c,那么就可以确定move(3)的字典序大于后面全部的。

对于这些move串的相对字典序,可以使用deque来倒序维护。

//冷静,冷静,冷静
//调不出来就重构
//#pragma GCC optimize(2)
//#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define count2(x) __builtin_popcountll(x)
#define is2(x) __builtin_ffsll(x)
#define endl '\n'
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
random_device rd;
mt19937_64 mt(rd());
typedef pair<ll,ll> pii;
const int N=1e6+10,mod=1000000007,P=131;
void Jiuyuan()
{string s;map<char,ll> op;ll n,k;cin>>n>>k;cin>>s;s=' '+s+' ';for(int i=1;i<=n;i++){op[s[i]]++;}ll nm=0;for(auto v:op)//确定串的首位字符是什么 {if(nm+v.second>=k){k-=nm;nm=v.first;break;}nm+=v.second;}deque<ll> kp;vector<ll> last(n+10);//确定i位置后第一个不同的位置在什么地方 ll id=n+1;for(int i=n;i>=1;i--){if(i<n&&s[i]==s[i+1]){last[i]=last[i+1];}else last[i]=i+1;}for(int i=n;i>=1;i--){if(s[i]!=nm)continue;//如果不是要提到首位的字符直接跳过 ll x=last[i];if(s[i]<s[x])//因为是倒序维护,把这个位置插入deque的最后一位,这个move串的字典序比之前出现的都大 {kp.push_back(i);}else if(s[i]>s[x])kp.push_front(i);//因为是倒序维护,把这个位置插入deque的第一位,这个move串的字典序比之前出现的都小 }for(int i=1;i<k;i++)kp.pop_front();cout<<s[kp.front()];for(int i=1;i<=n;i++){if(i==kp.front())continue;cout<<s[i];}cout<<endl;
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);ll T=1;cin>>T;while(T--){Jiuyuan();}return 0;
}


http://www.mrgr.cn/news/66322.html

相关文章:

  • C# 两个不同文件路径的同步
  • 非线性数据结构之图
  • 5G时代已来:我们该如何迎接超高速网络?
  • centos7 安装python3.9.4,解决import ssl异常
  • 服务器数据恢复—RAID5阵列硬盘坏道掉线导致存储不可用的数据恢复案例
  • 运动控制 电机
  • 进程的调度(超详细解读)
  • Day 49 || 1143.最长公共子序列、1035.不相交的线、 53. 最大子序和 、392.判断子序列
  • Java入门(8)--反射机制
  • 零基础学习Spring AI Java AI SpringBoot AI调用大模型OpenAi Ollama集成大模型
  • HarmonyOS开发 - Ability往页面(Pages)中传递数据
  • 年薪平均几十万?!哪些行业的软件测试工程师需求量大,前景好?
  • ubuntu工具 -- ubuntu服务器临时没有网络,急需联网下载东西怎么办? 使用手机提供网络
  • @ApiOperation(“修改帐号状态“)详细解释一下以上代码
  • 视频监控接入平台功能:视频平台系统的硬件性能直观显示和系统软件运行情况和状态显示
  • 【初阶数据结构篇】链式结构二叉树(续)
  • vue组件在项目中的常用业务逻辑(3)
  • 11.5 dmy NOIP模拟赛DAY4 总结
  • operator[ ]和迭代器,auto,for流,reserve
  • MySQL初学之旅(1)配置与基础操作
  • 数据库基础(4) . 数据库结构
  • Unity自动打包——Shell交互
  • 【C/C++】memcpy函数的使用
  • centos 6 yum安装 rabbitmq
  • 软硬链接与动静态库
  • 无需懂代码!用AI工具Bolt一键生成网站的入门指南!