P17043 [NWERC 2021] 术语表排列 / Glossary Arrangement

题目背景

译自 [Northwestern Europe Regional Contest (NWERC) 2021](http://2021.nwerc.eu) Problem G。 原题许可协议为 CC BY-SA。

题目描述

在基于 Unix 的操作系统中,最常用的命令之一是 `ls`,它会按字典序显示某个目录中的所有文件列表。在最基本的形式中,`ls` 会将每个文件名单独打印在一行;但为了提高可读性并节省屏幕空间,列表通常会被分成多列并并排显示。 你的一位朋友正在写一本关于 NWERC 的书,并让你负责编辑每章末尾相关术语的术语表。每个术语表都必须使用和 `ls` 相同的多列布局,所以你选择了偷懒的办法:对于术语表中的每个单词,你创建一个以该单词命名的空文件,然后直接让 `ls` 完成繁重工作。 不幸的是,你的朋友并不满意你的排版,并抱怨其中一些排版占用了太多竖向空间。你的方法的问题在于:`ls` 总是形成等高的列,只有最后一列可能较短。有时,如果允许更自由地选择每一列的高度,就可以使用更少的行数: :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/bzy3xdrf.png) ::: 图示:使用可变列高可以节省两行。 你不情愿地决定编写自己的改进版 `ls`,即 `ls--`。它同样按字典序显示目录内容,但会使用可变列高,以始终达到最少行数。 每一列有固定宽度,等于该列中最长文件名的长度;相邻列之间用一个空格分隔。每列中的名称必须左对齐,并用空格填充到该列宽度。此外,你正在使用的终端宽度固定为 $w$ 个字符,表格不能超过这个宽度。 给定一个目录内容列表,即若干文件名,请找到一种最优列布局,使打印整个列表所需的行数最少。

输入格式

输入包含: - 一行两个整数 $n$ 和 $w$($1 \leq n,w \leq 5\,000$),分别表示文件数量和终端宽度。 - 接下来 $n$ 行,每行一个文件名 $s$($1 \leq |s| \leq w$,$s$ 只包含小写英文字母)。 文件名互不相同,且已按字典序给出。所有文件名的总字母数不超过 $10^6$。

输出格式

输出一种列出给定文件名的最优方式: - 第一行输出两个整数 $r$ 和 $c$,表示使用的行数和列数。 - 第二行输出 $c$ 个正整数 $a_1,a_2,\ldots,a_c$,表示各列宽度。 - 然后输出文件名表格,需满足以下格式规则: - 有 $c$ 列,其中第 $i$ 列宽度为 $a_i$;每列中最多有 $r$ 个文件名,这些文件名左对齐并集中在该列顶部。 - 文件名使用空格对齐,列与列之间恰好有一个空格。 - 表格总宽度最多为 $w$。 - 按列从上到下、从左到右读取时,文件名必须按字典序出现。 注意,与其他题目不同,你必须严格遵守上述空白字符格式规则。不过,我们仍允许每行末尾出现尾随空格,即使这些尾随空格使该行超过宽度 $w$。

说明/提示

【数据规模与约定】 对于所有数据,$1 \leq n,w \leq 5\,000$;$1 \leq |s| \leq w$;文件名只包含小写英文字母,互不相同,并且按字典序给出;所有文件名总长度不超过 $10^6$;输出格式对空白字符敏感。