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。