#P1390. 两个子序列
两个子序列
题目描述
在一堂 IT 课上,Valera 学习了数据压缩。我们现在将向你介绍老师所讲解的一种新的数据压缩方法。
定义压缩函数 :
- 空序列 空字符串
- 对于任意一个字符串 ,。
- 对于任意两个字符串 ,, 为包含前缀 且包含后缀 的字符串中长度最小的一个。
- 对于任意 个字符串,$f({s_{1},s_{2},\ldots,s_{n}})=f(f({s_{1},s_{2},\ldots,s_{n-1}}),s_{n})$
例如:
- $f(000,000,111)=f(f(000,000),111)=f(000,111)=000111 $
现在 Valera 面临一个难题:他需要将给定的需要压缩的序列 分成两个新的序列 和 ,使得$S=|f({b_{1},b_{2},\ldots,b_{k}})|+|f({c_{1},c_{2},\ldots,c_{m}})|$ 的值最小。这里 表示字符串 的长度。
注意:
- 不允许在子序列中更改元素的相对顺序。
- 可以使得 即可以使得序列 、 中的一个为空。
- 对于原序列 中的任意一项 ,不得既不存在于 中,亦不存在于 中。也不得同时存在于 和 中。
- 、 中的元素在 中不必连续,即 和 的元素可以在 中交替出现(参见样例 、)。
输入格式
第一行一个整数 ,表示序列 的项数。
接下来 行,每行一个字符串,第 行输入的字符串表示序列 的第 项,即 。
输入数据保证序列 中的所有项长度相同,并且仅由数字 或 组成。
输出格式
一行一个整数, 的最小值。
3
01
10
01
4
最佳的方法为:一个子序列为空,另一个子序列等于原始序列 。此时$S_{min}=|f(01,10,01)|=|f(f(01,00),01)|=| f(010,01)|=|0101|=4$。故输出 。
4
000
111
110
001
8
最好的选择是:,。此时。故输出 。
5
10101
01010
11111
01000
10010
17
最好的选择是:。此时。故输出 。