CF1537E2 Erase and Extend (Hard Version)
题目描述
这是该问题的困难版本。唯一的区别在于 $n$ 和 $k$ 的约束条件。只有在所有版本的问题都被解决后,你才能进行 hack。
你有一个字符串 $s$,你可以对它进行两种操作:
- 删除字符串的最后一个字符。
- 复制字符串:$s := s + s$,其中 $+$ 表示连接操作。
每种操作你都可以使用任意次数(也可以一次都不用)。
你的任务是,通过对字符串 $s$ 进行上述操作,得到长度恰好为 $k$ 的字典序最小的字符串。
如果满足以下任意一条,字符串 $a$ 的字典序小于字符串 $b$:
- $a$ 是 $b$ 的前缀,且 $a \ne b$;
- 在 $a$ 和 $b$ 第一个不同的位置,$a$ 的字母在字母表中比 $b$ 的对应字母更靠前。
输入格式
第一行包含两个整数 $n$ 和 $k$($1 \leq n, k \leq 5 \cdot 10^5$),分别表示原始字符串 $s$ 的长度和所需字符串的长度。
第二行包含字符串 $s$,由 $n$ 个小写英文字母组成。
输出格式
输出通过上述操作可以得到的长度恰好为 $k$ 的字典序最小的字符串。
说明/提示
在第一个测试样例中,最优方案是进行一次复制操作:"dbcadabc" $\to$ "dbcadabcdbcadabc"。
在第二个测试样例中,最优方案是先删除最后 $3$ 个字符,然后复制字符串 $3$ 次,再删除最后 $3$ 个字符,使字符串长度为 $k$。
"abcd" $\to$ "abc" $\to$ "ab" $\to$ "a" $\to$ "aa" $\to$ "aaaa" $\to$ "aaaaaaaa" $\to$ "aaaaaaa" $\to$ "aaaaaa" $\to$ "aaaaa"。
由 ChatGPT 4.1 翻译