#486. 交换字符

传统 1000 ms 1024 MiB
标准 IO
文本比较 dd 标签

题目描述

给你一个仅包含英文小写字母的字符串 ss,你可以交换任意两个相邻字母不超过 kk 次,交换之后,字符串 ss 中逆序对可能的最小数目是多少?

假如说字符串中有两个字母的下标分别是 iijj,这两个字母相邻当且仅当 ij=1|i-j|=1

字符串中的一个逆序对是指字符串中存在下标为 iijj 的两个字母 s[i]s[i]s[j]s[j],有 s[i]>s[j]s[i]>s[j]1i<jn1 \leq i < j\leq n
字符的大小是根据ASCII值决定的,例如 z>x'z'>'x'

输入格式

第一行输入两个整数 n(1n2×105)n(1 \leq n \leq 2\times10^5)k(0k109)k(0 \leq k \leq 10^9),代表字符串的长度和最多的交换次数 。
第二行输入一个长度为 nn 的字符串 ss

输出格式

输出一个整数,代表交换相邻字符不超过 kk 次的后字符串最少的逆序对数量。

样例

输入样例1

5 2
acbeb

输出样例1

1

输入样例2

4 4
dcba

输出样例2

2

提示
对于第 11 组样例,首先交换下标为 2233 的字符,然后交换下标为 4455 的字符,交换结束后字符串变为 abcbe,逆序对有 11 对,即 i=3,j=4i=3,j=4

考虑到答案可能很大,你可能需要使用可以存储 6464 位整数的数据类型来表示答案,比如 C++\texttt{C++} 中的 long long\texttt{long long}