首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后缀数组的LCP数组

后缀数组的LCP数组
EN

Stack Overflow用户
提问于 2014-03-13 19:57:03
回答 1查看 249关注 0票数 1

如何计算后缀数组的LCP数组?它不一定是最有效的。O(n log n)或O(n)就可以了。如果可能的话,一些相对容易编码的东西。

EN

回答 1

Stack Overflow用户

发布于 2014-12-12 02:04:31

下面是一个简单的C++实现。最长通用前缀(LCP)将保存在lcpMAX数组中:)

代码语言:javascript
复制
char str[MAX];
int n,gap,sa[MAX],pos[MAX],tmp[MAX],lcp[MAX];
// sa stores the sorted index of the suffixes
// pos stores the serial number of a index in the sorted sequence
bool sufCmp(int i, int j)
{
    if(pos[i]!=pos[j])
      return pos[i]<pos[j];
    i+=gap;
    j+=gap;
    return (i<n&&j<n)?pos[i]<pos[j]:i>j;
}
void buildSA()
{
    n=strlen(str);
    for(int i=0;i<n;i++)
      sa[i]=i,pos[i]=str[i];
    for(gap=1;;gap*=2)
    {
        sort(sa,sa+n,sufCmp);
        for(int i=0;i<n-1;i++)
          tmp[i+1]=tmp[i]+sufCmp(sa[i],sa[i+1]);
        for(int i=0;i<n;i++)
          pos[sa[i]]=tmp[i];
        if(tmp[n-1]==n-1)
          break;
    }
}
void buildLCP()
{
    for(int i=0,k=0;i<n;++i)
    {
        if(pos[i]==n-1)
          lcp[pos[i]]=0;
        else
        {
            for(int j=sa[pos[i]+1];str[i+k]==str[j+k];)
              k++;
            lcp[pos[i]]=k;
            if(k)
              k--;
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22377891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档