#4457. 创造

题意

有n和串,要从中按顺序选出一些,使它们拼在一起(不能交换顺序)长度为k,求最小字典序(满足一定有解)。

范围

n<=3000,k<=1e4,∑∣si∣\sum |s_{i}|si ≤\le 1e6

题解

考虑DP,记前i个串组成长度为j的字典序最小的串为f,但这样显然效率太低,又不可直接优化,故考虑有什么性质可以用来优化。
考虑前i个串组成长度为j的串后,后面的长度也要能够由后面的串拼出来才行,于是只需要记录对于前i个串的那些合法的长度的最小串即可。这些串是否能高效表示出来?再进一步考虑,对于每一个合法长度的最小串,既然都最后能拼出来了,那么目前字典序大的那些串(指仅比较有的字符,不考虑长度)一定更劣,即没有用了,所以只需要保留字典序最小的那一些,即只会是一个最小串的一些前缀,用一个字符串加上一个bitset即可记录。
考虑转移,对于每个合法位置(当前最小串的前缀),接上当前串,如果合法则同之前的思路,取最小串的一些前缀,再用类似的思想与原来的最小串比较,在比较时需要用到当前串和原串的lcp,用exkmp即可求出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值