【发布时间】:2014-10-17 15:41:10
【问题描述】:
有人能解释一下这个从后缀数组构造 LCP 的代码是如何工作的吗? suffixArr[] 是一个数组,这样suffixArr[i] 保存字符串中具有等级 i 的后缀的索引值。
void LCPconstruct()
{
int i,C[1001],l;
C[suffixArr[0]] = n;
for(i=1;i<n;i++)
C[suffixArr[i]] = suffixArr[i-1];
l = 0;
for(i=0;i<n;i++)
{
if(C[i]==n)
LCPadj[i] = 0;
else
{
while(i+l<n && C[i]+l<n && s[i+l] == s[C[i]+l])
l++;
LCPadj[i] = l;
l = max(l-1,0);
}
}
for(i=0;i<n;i++)
cout<<LCPadj[suffixArr[i]]<<"\n";
}
【问题讨论】:
-
嗯,你从哪里弄来的?
-
我正在查看关于 codechef 的问题的解决方案。 codechef.com/problems/MOU1H
-
关于解决方案的长篇社论并没有帮助您理解它是如何工作的?写的很详细。
-
其实我看到了一个用户的代码,因为我创建后缀数组的方法最接近他的。社论中使用的方法完全不同。
-
我不确定我们在这里是如何使用 l 的。每次迭代后它都会更新为 max(l-1,0),而不是每次都从 0 开始。
标签: c++ algorithm suffix-array