Trie上的后缀数组

6 篇文章 0 订阅

亦称为广义后缀数组

Definition

LCS=Longest Common Suffix
LCP=Longest Common Preffix
Sv S v 表示Trie上节点v到根的路径形成的字符串

Intro

由于在Trie上,自带去重功能
显然 LCS(Su,Sv)=deplca(u,v) L C S ( S u , S v ) = d e p l c a ( u , v )
我们要实现后缀数组的功能,即把 sa,rank,H(height) s a , r a n k , H ( h e i g h t ) 都求出来
sa,rank s a , r a n k 很好求,类比序列情形,倍增,将两个长度 2i1 2 i − 1 的信息双关键字排序得到 2i 2 i 长度的信息。这里,我们只需取出每个点的 2i1 2 i − 1 级祖先。
其余部分类似于序列上的做法。
然后我们要兹磁查询 LCP(Su,Sv) L C P ( S u , S v )
一个思路是求出 Hi H i ,即 LCP(Ssai1,Ssai) L C P ( S s a i − 1 , S s a i )
一个方法是二分+哈希,但是有更简单的做法,我们对倍增过程每个点的 rank r a n k 保留下来(据说这叫波兰表),那么我们可以倍增求任意两个点的 LCP L C P ,代码大概长这样

int LCP(int u , int v) {
    if (u == v)
        dep[u];
    int l = 0;
    per (i , lg , 0) if (rk[u][i] == rk[v][i]) {
        l += 1 << i;
        u = pa[u][i] , v = pa[v][i];
    }
    return l;
}

然后类似地,使用ST表支持RMQ即可O(1)询问任意两点LCP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值