Algorithm 在常数时间和线性空间中求两个字符串的LCP

Algorithm 在常数时间和线性空间中求两个字符串的LCP,algorithm,data-structures,prefix,Algorithm,Data Structures,Prefix,这就是问题所在: 假设S是一组字符串,我们知道n中S中所有字符串的总长度。我们必须找到一个空格为On的数据结构,它在O1中找到LCP,t,LCP是字符串s,t之间最长的公共前缀 起初我认为我可以使用散列,因为我们可以在固定时间内检查数字,如果我们对字符串进行预置,则可以在固定时间内查找子字符串。但我认为这不起作用,因为它需要更多的空间,经过一点搜索,我发现解决方案可能在于使用Trie、后缀数组以及可能的LCA和RMQ。我想我已经接近答案了,但我不知道这些概念如何协同工作,形成一个快速提供LCP的

这就是问题所在: 假设S是一组字符串,我们知道n中S中所有字符串的总长度。我们必须找到一个空格为On的数据结构,它在O1中找到LCP,t,LCP是字符串s,t之间最长的公共前缀

起初我认为我可以使用散列,因为我们可以在固定时间内检查数字,如果我们对字符串进行预置,则可以在固定时间内查找子字符串。但我认为这不起作用,因为它需要更多的空间,经过一点搜索,我发现解决方案可能在于使用Trie、后缀数组以及可能的LCA和RMQ。我想我已经接近答案了,但我不知道这些概念如何协同工作,形成一个快速提供LCP的数据结构


感谢阅读

我想我知道他们在寻找的答案

首先,为所有字符串构造一个trie。trie中的每个节点都可以包含指向以该前缀开头的字符串的指针和长度。将每个字符串映射到trie中该字符串结束的最后一个节点

现在,当给定一对字符串时,可能会告诉您字符串i和字符串j,返回字符串的问题是找到最不常见的祖先,然后将对指针返回到字符串length的开始

但是trie可以写成一棵树,然后Tarjan的离线最低共同祖先算法see可以用于对该树进行预处理,以快速回答LCA问题


从技术上讲,它不是O1。然而,对于任何一台适合于可观测宇宙的计算机来说,Oinverse_Ackermann都可以被视为一个相当小的常数。

我们可以假设每个字符串的长度是sqrtn,并且存在sqrtn字符串吗?@Yonlif我不这么认为。我们只知道它们的总长度是nI,我想用比sqrtn长的字符串进行重-轻分解。@Yonlif就像压缩一个trie?s和t是什么?因为如果它们是字符串,那么你甚至无法在固定时间内识别它们。如果它们可以在固定时间内映射到内部节点,那么您可以在trie上执行LCA查询。Trajan的LCA是一种离线算法,即使在预处理之后,也无法在该时间内回答任意单个查询。有一种方法是在使用线性空间进行预处理后,在固定时间内通过使用树的Euler遍历将问题减少到一个范围最小的查询。看到和