#P13469. [GCJ 2008 #2] PermRLE

    ID: 13280 远端评测题 10000ms 1024MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>动态规划 DP2008状压 DPGoogle Code Jam

[GCJ 2008 #2] PermRLE

Description

你发明了一种对游程编码(RLE)压缩算法的轻微修改,称为 PermRLE。

为了压缩一个字符串,该算法选择 11kk 之间整数的某个排列,将该排列应用到给定字符串的前 kk 个字母,然后应用到接下来的 kk 个字母的块,依此类推。字符串的长度必须能被 kk 整除。在对所有块进行排列后,新的字符串将使用 RLE 进行压缩,RLE 的描述见下文。

将给定的排列 pp 应用于一个 kk 个字母的块,意味着将这些字母中的第 p[1]p[1] 个放在第一个位置,第 p[2]p[2] 个放在第二个位置,依此类推。例如,将排列 {3,1,4,2}\{3,1,4,2\} 应用于块 "abcd",得到 "cadb"。将其应用于更长的字符串 "abcdefghij" 的各个块,得到 "cadbgehfik"。

排列后的字符串随后使用游程编码进行压缩。为简化起见,我们将字符串的压缩大小定义为连续相同字母分组的数量。例如,"aabcaaaa" 的压缩大小为 44;四个分组分别是两个字母 "a" 的一组,然后 "b" 和 "c" 各自为一组,最后是一组较长的 "a"。

显然,压缩大小可能取决于所选择的排列。由于压缩算法的目标是最小化压缩文本的大小,你的任务是选择能得到最小压缩大小的排列,并输出该最小值。

Input Format

第一行输入一个整数 NN,表示测试用例的数量。接下来有 NN 组测试用例。

每组测试用例的第一行包含一个整数 kk。第二行包含要压缩的字符串 SS

Output Format

对于每个测试用例,输出一行,格式为 "Case #X: Y",其中 XX 是测试用例编号,YYSS 的最小压缩大小。

2
4
abcabcabcabc
3
abcabcabcabc
Case #1: 7
Case #2: 12

Hint

限制条件

  • N=20N = 20
  • SS 只包含小写字母 'a' 到 'z'
  • SS 的长度能被 kk 整除

小数据范围(5 分,测试集 1 - 可见)

  • 2k52 \leq k \leq 5
  • 1S1 \leq S 的长度 1000\leq 1000

大数据范围(30 分,测试集 2 - 隐藏)

  • 2k162 \leq k \leq 16
  • 1S1 \leq S 的长度 50000\leq 50000

由 ChatGPT 4.1 翻译