HDU 2459 PKU 3693 Maximum repetition substring 后缀数组 RMQ

本文介绍了如何使用后缀数组和RMQ(Range Minimum Query)来解决找出字符串中能被分割成最多相同子串的问题。通过枚举子串重复部分的长度,并计算两个后缀的最长公共前缀,可以确定重复子串及其数量。在处理特殊情况时,如果枚举步长导致遗漏,需要进一步检查。最后,文章提供了相关代码实现。
摘要由CSDN通过智能技术生成

题目地址:

HDU 2459
PKU 3696

题意:

给一个长度不超过 1e5 的字符串,找出其中一个子串,要求该子串能够被分割成尽可能多的相同的字符串,若有多个符合要求的子串,输出字典序最小的那个。

思路:

图片不看也没关系,但这个是罗穗骞大佬在他的论文《后缀数组——处理字符串的有力工具》里的原话,然后这是他的spoj687的代码:http://paste.ubuntu.com/23923746/,本人就是参考他的代码,明白了思路的
论文第19页

RMQ部分只是用来求lcp的,不说了
枚举子串重复部分的长度L,然后以L为步长,枚举题目所给的字符串下标,设lcp是suffix[L]和suffix[2 * L]的公共前缀,只要 lcp>=L ,重复的字符串就出现了(首先两者相同的部分超过了suffix[L]和suffix[2 * L]的距离,然后suffix[2 * L]作为suffix[L] 的子串,重复lcp部分,就构成了一个有重复的字符串,可能这里有点绕……不懂的读者可以自己举例理解下)。
重复部分的重复次数自然就是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值