码迷,mamicode.com
首页 > 其他好文 > 详细

SAM

时间:2020-03-03 11:05:19      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:amp   oid   关于   DPoS   ++   eof   mem   节点   size   

关于 SAM:

  • lnk 树上,任意非叶子节点,其孩子节点的 endpos 集合是本身 endpos 集合的划分。
  • SAM 的 lnk 树是“前缀树”,任意节点是其孩子节点的后缀。
int kid[T][A], len[T], lnk[T];
int lst = 1, ct = 1;
void insert(int c) {
    int p = lst, np = ++ct;
    len[np] = len[p] + 1, siz[np] = 1, lst = np;
    for (; p && !kid[p][c]; p = lnk[p]) kid[p][c] = np;
    if (!p) lnk[np] = 1;
    else {
        if (len[p] + 1 == len[kid[p][c]]) lnk[np] = kid[p][c];
        else {
            int q = kid[p][c], nq = ++ct;
            len[nq] = len[p] + 1, lnk[nq] = lnk[q], lnk[q] = lnk[np] = nq;
            memcpy(kid[nq], kid[q], sizeof(kid[q]));
            for (; p && kid[p][c] == q; p = lnk[p]) kid[p][c] = nq;
        }
    }
}

SAM

标签:amp   oid   关于   DPoS   ++   eof   mem   节点   size   

原文地址:https://www.cnblogs.com/Ryedii-blog/p/12400566.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!