【UOJ 494】DNA序列(贪心)(Lyndon分解)
DNA序列
题目链接:UOJ 494
题目大意
给你 n 个字符串,要你每个都选一段非空前缀按某种顺序拼在一起使得形成的大字符串字典序最小。
思路
假设如果知道插入的顺序,我们要怎么选前缀。
发现如果前面的 个都安排好了,那你最后一个选啥是确定的(只选一个字符)
那倒数第一个就确定了,接着看第 个那你就枚举所有的前缀跟最后一个加一下,选最小的方案。(选最小的准没错,因为不会再后面变劣)
那这样倒着贪心就能构造出字符串。
于是考虑顺序。
那你会发现直观的看我们肯定是先放第一个是 ,接着是 这样的。
然后如果那个数的接下来一个小于它,那其实我们应该吧它选上。
然后思考会发现其实它是最大表示串,其实就是 为比较的 Lyndon Word。
(因为后缀都比它大那我们把所有前缀循环展开也是前面比它大了)
那我们可以用 Lyndon 分解找到第一个串。
那你可以按这个排序来确定顺序,但是要注意的是这里的也是循环展开比较。
那因为必定不是循环串,我们可以在后面加一个很大的字符,加速上面的操作。
但是还有问题,就是这个 Lyndon Word 可能会一样。
那你考虑一样的内部如何安排顺序,那最后一个的后面可能会放一些东西。
那放啥呢?设 Lyndon Word 是 ,那你串可以表示成 的一段前缀,那你就是要让 字典序最小(记得也要展开,即加大字符)
那你就直接按 从大到小排序即可。
代码
__EOF__

本文作者:あおいSakura
本文链接:https://www.cnblogs.com/Sakura-TJH/p/LOJ_494.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Sakura-TJH/p/LOJ_494.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-11-10 【luogu P6800】Chirp Z-Transform(多项式)(NTT)(bluestein 算法)