poj9080

求n个字符串的最长公共字串,本题可以暴力,,,

实际上,因为字符串长度很小,选一个作为模板串,其余为文本进行匹配即可,,,话说数据小点就是展开枚举辅助的节奏,,,

现在来思考一下当数据变大时的情况,怎样做到高效的多个字符串的最长公共字串和子序列啥的?

比如长度为1000? 两个的好求,dp一下复杂度O(NM)

如果多个字符串,可以展开分治改变求解顺序,将字符串一分为二,分别求出各自组的最长公共字串,再合并,复杂度:O(NMLOGX),但局限性太大,若有多个最长的串就无法工作,想一下,字符串里难题很多,判重啊,等等,其实,匹配问题实际上可以用字符串hash也就是RK算法解决,那么这个问题同样可以用字符串hash思想,枚举最长字串的长度,容易知道满足二分性质,故二分答案x,每次将字符串hash并保存,对于每一个可能的值,如果在每个字符串中至少出现一次,那么就是一个伪命中点,到这里我们可以停下直接输出,但实际上,不准确,那么最难的工作是如何判断?1.拷贝并排序,对于同一个字符串里的两个相同值计数一次,最后估计计数的次数是否等于n,这里复杂度:

o(nllogn),总体复杂度:O(nlLOGl+x*nllogn)=O(xnllogl),x为相同值的数量,当然二分每次要选取不同的值作为取模数 2.算着算着,我们遇到了字符串排序,慢!还不如再hash,对就是多重hash的思想,应用广泛,如果一次不行,我们就选取多个底数多次hash直到完成工作,复杂度和上面差不多吧,但实际更快,虽然准确度差了点,,但没问题

到此,我认为多字符串公共字串在hash下已成功解决,还有别的方法吗?比如将其挂到后缀树上?什么后缀数组啥的?不知道,,,代码实现?日后一定,,,

另一个问题:多个的最长公共子序列?


你可能感兴趣的:(poj9080)