CF1183H Subsequences (hard version)

题目描述

简单版和困难版的唯一区别在于约束条件。 子序列是指可以通过从另一个字符串中删除若干(可以为零)字符且不改变剩余字符顺序得到的字符串。被删除的字符不要求连续,中间可以有任意间隔。例如,对于字符串 "abaca",以下字符串是它的子序列:"abaca"、"aba"、"aaa"、"a" 和 ""(空串)。但以下字符串不是它的子序列:"aabaca"、"cb" 和 "bcaa"。 给定一个由 $n$ 个小写拉丁字母组成的字符串 $s$。 每次操作,你可以取 $s$ 的任意一个子序列 $t$,并将其加入集合 $S$。集合 $S$ 不能包含重复的元素。每次操作的代价为 $n - |t|$,其中 $|t|$ 表示所添加子序列的长度(即代价等于被删除字符的数量)。 你的任务是求出获得大小为 $k$ 的集合 $S$ 的最小总代价,或者报告无法做到。

输入格式

输入的第一行包含两个整数 $n$ 和 $k$($1 \le n \le 100, 1 \le k \le 10^{12}$),分别表示字符串的长度和集合的大小。 第二行包含一个由 $n$ 个小写拉丁字母组成的字符串 $s$。

输出格式

输出一个整数——如果无法获得大小为 $k$ 的集合 $S$,输出 $-1$。否则,输出获得集合 $S$ 的最小总代价。

说明/提示

在第一个样例中,可以生成 $S = \{\text{"asdf"}, \text{"asd"}, \text{"adf"}, \text{"asf"}, \text{"sdf"}\}$。$S$ 中第一个元素的代价为 $0$,其余元素的代价为 $1$。所以 $S$ 的总代价为 $4$。 由 ChatGPT 4.1 翻译