自创题目-Swap And Reverse(Hard)

文章描述了一种名为SwapAndReverse的字符串操作问题,目标是在给定的最大操作次数k内,通过最少的交换操作得到字典序最小的字符串。涉及固定操作和回溯,以及优先级选择原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                Swap And Reverse(Hard)
                   Writer:Yue_chen
                时间限制:c/c++:1000ms
                     其他语言:2000ms

给定一个字符串s
对于被操作串s,你每一次可以进行以下两个操作之一:(当然也可以不进行操作)
        1.交换si 与 s(i+2)
        2.交换si 与 s(n-i)(n为被操作串长度)

当si为第一个元素或si前面的元素全部已经固定时,你可以固定si:
        将从上一次固定之后开始的所有与si相关的操作全部回溯(回溯与固定不计入操作次数),然后只交换si与sj的值,新的被操作串为未被固定的串,n-=1。(简单来说,即只交换上一次固定之后的新被操作串中的si与sj,其他字符保持上一次固定之后的原位置,并将新的i位置的元素固定,剩下的未被固定的串成为新的被操作串,n-=1)

如:
edcba --操作1--> edabc --操作2--> cdabe --固定c-->(c)deba,(相当于只交换了c与e)c被固定,新的被操作串为deba,n由5变为4。

现在有这样的要求:
    如果每次固定si,尽可能地选择所有与sj相同的字符中操作次数最小的(如果出现多解,优先选择位置距离si更近的sj)
        请输出在最大操作次数k内能获取的最小字典序字符串。

输入:
第一行一个 t ,表示测试用例的组数(1<=t<=1000)
对于每组测试:
第一行一个 n ,一个 k ,中间用一个空格分隔,分别表示被操作串的初始长度,和最大操作次数。(1<=n<=10000,1<=k<=1e9)
第二行一个字符串 s ,表示被操作的字符串。(保证只包含英文字母a-z)

(对于所有测试用例,我们可以保证 n 的总和不超过10000。)

输出:
在最大操作次数k内能获取的最小字典序字符串。

样例:

Input:
1
6 3
fedcab

Output:
abdcfe

解释:
在样例一中,先用操作一将a与d交换-->feacdb,再用操作一将a与f交换-->aefcdb,固定a并回溯-->(a)edcfb,新被操作串为edcfb,n为5,再用操作二交换b和e-->bdcfe,固定b并回溯-->(ab)dcfe,依次固定dcfe-->(abdcfe),输出abdcfe。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值