EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

P2470 [SCOI2007] 压缩

题目链接:P2470 [SCOI2007] 压缩 - 洛谷

题目描述

给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息。压缩后的字符串除了小写字母外还可以(但不必)包含大写字母 R 与 M,其中 M 标记重复串的开始,R 重复从上一个 M(如果当前位置左边没有 M,则从串的开始算起)开始的解压结果(称为缓冲串)。

bcdcdcdcd 可以压缩为 bMcdRR,下面是解压缩的过程:

已经解压的部分 解压结果 缓冲串
b b b
bM b .
bMc bc c
bMcd bcd cd
bMcdR bcdcd cdcd
bMcdRR bcdcdcdcd cdcdcdcd

输入格式

输入仅一行,包含待压缩字符串,仅包含小写字母,长度为 n。

输出格式

输出仅一行,即压缩后字符串的最短长度。

输入输出样例 #1

输入 #1

1
aaaaaaa

输出 #1

1
5

输入输出样例 #2

输入 #2

1
bcdcdcdcdxcdcdcdcd

输出 #2

1
12

说明/提示

在第一个例子中,解为 aaaRa,在第二个例子中,解为 bMcdRRxMcdRR

【限制】

50%的数据满足:1n20

100%的数据满足:1n50

题解

定义 f(l,r,0/1) 表示子串 slr 在不使用/使用 M 操作的压缩后最小长度。

若子串 slr 可被折叠,则 f(l,r,0)=f(l,mid,0)+1

f(l,r,0)=minlk<r{f(l,k,0)+1}f(l,r,1)=minlk<r{min(f(l,k,0),f(lk1))+1+min(f(k+1r1),f(k+1r0))}

最后答案即为 min(f(1,n,0),f(1,n,1))