trie上构建后缀数组和波兰表

原创 2016年03月16日 19:24:14

普通后缀数组的倍增构建

​ 对于单个字符串上的后缀数组的建造,一般都是倍增一个长度l,然后对于当前的排序组,每隔l就把两个元素并在一起,拿这两个东西分别作为两个关键字再排序,直到倍增长度大于字符串长。其实这个倍增算法如果在trie上也是同样适用。

trie上后缀数组的倍增构建

​ 对于一个trie,我们同样可以通过倍增来求,只要把在序列上倍增k级变成树上的倍增k级祖先应该就可以了。如果我们把倍增的过程时的rk数组记录下来,我们就得到一个神奇的东西——用vfk的话来说就是波兰表。

​ 似乎在trie上SA建H数组有点不好搞,怎么办呢?没事,我们有波兰表!对于相邻的两个后缀,我们可以用记录下来的krk的信息来搞,然后类似倍增那样判断其k级的排名是否相同,然后就可以求出LCP了。

​ 代码大概是这样:

void build() {
    rep (i , 1 , n) rk[i][0] = str[i];
    rep (i , 1 , n) pa[i][0] = fa[i];
    rep (j , 1 , lg) {
        rep (i , 1 , n)
            pos[i] = mp(mp(rk[i][j - 1] , rk[pa[i][j - 1]][j - 1]) , i) ,
            pa[i][j] = pa[pa[i][j - 1]][j - 1];
        sort(pos + 1 , pos + n + 1);
        rk[pos[1].sec][j] = 1;
        int p = 1;
        rep (i , 2 , n)
            rk[pos[i].sec][j] = (pos[i - 1].fir == pos[i].fir) ? p : ++ 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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GEOTCBRL/article/details/50907662

波兰表 不会被卡但多了个Log的Hash

转自  http://vfleaking.blog.163.com/blog/static/174807634201321981915529/ 后来发现其实就是把倍增算法构造后缀数组的标号存下来...
  • YxuanwKeith
  • YxuanwKeith
  • 2016-07-30 16:08:56
  • 782

二叉树--后缀trie树

Suffix Trie:又称后缀Trie或后缀树。它与Trie树的最大不同在于,后缀Trie的字符串集合是由指定字符串的后缀子串构成的。比如、完整字符串"minimize"的后缀子串组成的集合S分别如...
  • wangxiaotongfan
  • wangxiaotongfan
  • 2016-06-03 20:32:59
  • 3081

找出文本中存在的坏单词-后缀trie

假设给定一个关键词rob,如果某一个单词中包含此字符串,那么就断定此字符串为bad word。如problem就包含rob,那么它就是bad word。其实这种叙述是:“判断一个字符串是否是另一个字符...
  • zzran
  • zzran
  • 2012-12-30 20:02:15
  • 1448

trie上构建后缀数组和波兰表

普通后缀数组的倍增构建​ 对于单个字符串上的后缀数组的建造,一般都是倍增一个长度ll,然后对于当前的排序组,每隔ll就把两个元素并在一起,拿这两个东西分别作为两个关键字再排序,直到倍增长度大于字符...
  • GEOTCBRL
  • GEOTCBRL
  • 2016-03-16 19:24:14
  • 1158

后缀树与后缀数组

后缀树和后缀数组是字符串处理的两大神器,几乎可处理掉一切的字符串处理问题,但是在实际中,后缀数组比后缀树更好写、好调,同时时间上也不差(常数很小),所以后缀数组绝对是OI竞赛之必备神器。...
  • WenDavidOI
  • WenDavidOI
  • 2016-08-12 11:14:36
  • 1384

BZOJ 2251 2010Beijing WC 外星联络 后缀数组/Trie树

题目大意给出一个字符串,问这个字符串中出现过1次以上的子串的个数,按照子串的字典序输出。思路由于数据范围过小,这个题有两个解法。 基本的想法就是用后缀数组来进行后缀的排序,之后按照height数组扫...
  • jiangyuze831
  • jiangyuze831
  • 2015-04-07 09:42:12
  • 1298

算法学习:后缀自动机转后缀树转后缀数组

算法学习:后缀自动机转后缀树转后缀数组 引入 其实这是一篇水文 想要学后缀自动机的话去查2012年noi冬令营陈立杰讲稿 顺便说一句,讲稿上有一些错误,多翻几篇博客加深理解。 今天这里主...
  • lvzelong2014
  • lvzelong2014
  • 2018-01-08 20:36:50
  • 181

后缀数组应用小结

前言 之前学了后缀数组,这真是一个神奇的东西。早就想总结一些SA的应用,但一直没时间,现在终于抽出空来写一下自己的心得。 本文只讨论后缀数组的一些应用,不一定全面,仅供参考 还不会后缀数组的同学请...
  • Akak__ii
  • Akak__ii
  • 2016-04-28 23:25:51
  • 1635

后缀数组总结

后缀数组——处理字符串的有力工具 作者:罗穗骞 2009年1月   【摘要】   后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树...
  • u014665013
  • u014665013
  • 2017-05-03 11:41:25
  • 1257

trie图的构建------易理解版

当然看这篇文章最好在看trie图那篇原文看不懂的情况下再看这篇 这篇只是便于理解肯定有很多不严谨的地方 看trie图看了一个小时终于看明白了,冯涛原创,我在网上就看到有一篇讲解trie图的看的好费...
  • u012329934
  • u012329934
  • 2014-07-26 22:32:15
  • 1233
收藏助手
不良信息举报
您举报文章:trie上构建后缀数组和波兰表
举报原因:
原因补充:

(最多只允许输入30个字)