给出n个字符串。对于由l和r组成的q查询,我应该为序列[l,r]中的所有字符串对输出LCP(最长公共前缀)。是否有任何可以帮助的数据结构(Segment树,Fenwick ......)有了这个?我怎么能预先计算任何东西,记住n和q都是< = 10 ^ 5。所有字符串长度的总和是< = 10 ^ 5?
除了蛮力解决方案,我没有其他想法......
答案 0 :(得分:0)
假设你有一些字符串。首先,您需要对它们进行排序。
1. hello | 1. broad
2. wi-fi | 2. brother
3. brother | 3. hell
4. sister | 4. hello
5. broad | 5. siam
6. siam | 6. sial
7. sial | 7. sister
8. sit | 8. sit
9. hell | 9. wi-fi
然后创建一个带索引的数组,以了解已排序数组中每个字符串的位置。
index in orignal - 1 2 3 4 5 6 7 8 9
index in sorted - 4 9 2 7 1 5 6 8 3
现在,对于每个查询,您需要在已排序的数组中查找最小和最大索引。基于这两个指数找到LCP。见例子。
<强>实施例。 1 强>
l,r = 1,5
排序数组中的对应索引是4 9 2 7 1
。最小和最大索引为1
和9
。所以单词broad
和wi-fi
在查询中,而LCP是空字符串。
<强>实施例。 2 强>
l,r = 6,8
排序数组中的对应索引是5 6 8
。最小和最大索引为5
和8
。因此,查询中包含siam
和sit
字样,而LCP为si
。
对所有字符串进行排序。要在此处正确估计复杂性,您需要正确建模可能的输入。
对于每个查询,您需要对最大和最小索引进行线性时间搜索,然后找到两个字符串的LCP。