[BZOJ3790]神奇项链

[BZOJ3790]神奇项链

试题描述

母亲节就要到了,小 H 准备送给她一个特殊的项链。这个项链可以看作一个用小写字
母组成的字符串,每个小写字母表示一种颜色。为了制作这个项链,小 H 购买了两个机器。第一个机器可以生成所有形式的回文串,第二个机器可以把两个回文串连接起来,而且第二个机器还有一个特殊的性质:假如一个字符串的后缀和一个字符串的前缀是完全相同的,那么可以将这个重复部分重叠。例如:aba和aca连接起来,可以生成串abaaca或 abaca。现在给出目标项链的样式,询问你需要使用第二个机器多少次才能生成这个特殊的项链。 

输入

输入数据有多行,每行一个字符串,表示目标项链的样式。

输出

多行,每行一个答案表示最少需要使用第二个机器的次数。

输入示例

abcdcba
abacada
abcdef

输出示例

0
2
5

数据规模及约定

每个测试数据,输入不超过 5行 

每行的字符串长度小于等于 50000 

题解

可以 dp 一下,设 f[i] 表示前 i 个字符中,最少由几个回文串可重叠地拼接而成,那么每次转移我们可以找到位置 i 的 P[i],查询 [i - P[i] + 1, n] 这个区间中的最小值 minv,然后用 minv + 1 更新 f[i+P[i]-1]。用线段树可以很容易地优化。

当然求出 P[i] 数组后,每个位置 i 可以转化成 [i - P[i] + 1, i + P[i] - 1] 这样的区间,然后贪心就好了。

这里只放线段树 + dp 的版本。

 

posted @   xjr01  阅读(354)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示