学习笔记(SAM)

后缀自动机学习笔记

性质
  • 首先,你最好认为每条边是一个字母,每个节点代表一个单词(从t0走到这个点即是此单词的一个后缀)。
  • 所有的正向边,从t0出发沿着nex形成的所有正向边构成一个DEG图,而所有的反向边,即link构成一颗t0为根的树,显然,此树上所有点到根形成的后缀都会被其儿子到根形成的后缀所包含
算法实现
  • 首先写个自定义函数,一般都叫sa_extend()
  • 我们默认根t0是0,他的link(父亲)为-1。
  • 首先新申请一个节点cur,我每次将上一个节点叫做last,先将len[cur]=len[last]+1,(len数组代表其到根节点的距离)
  • 然后沿着last节点一直往上跳(如果该节点没有你要加的那个节点的儿子),将所有这些节点nex那个字母都连到cur上
  • 如果一直跳到-1了,就将cur的link连到0上,并退出.
  • else
  • 如果当前节点(p)此儿子(q)的len==当前节点len+1,就将cur的link设为q
  • else
  • 申请一个新的节点(一般叫clone),将clone的len设为此节点len+1,并将q的所有信息复制给clone,将q与cur的link都设为clone,继续沿着p往上跳,将所有有儿子q的点改为clone。
代码实现
void sa_extend(int x)
{
    int cur=++sz;
    len[cur]=len[last]+1;
    int p;
    for(p=last;p!=-1&&!nex[p][x];p=link[p])nex[p][x]=cur;
    if(p==-1)link[cur]=0;
    else
    {
        int q=nex[p][x];
        if(len[p]+1==len[q])link[cur]=q;
        else
        {
            int clone=++sz;
            len[clone]=len[p]+1;
            For(i,0,25)nex[clone][i]=nex[q][i];
            link[clone]=link[q];
            for(;p!=-1&&nex[p][x]==q;p=link[p])nex[p][x]=clone;
            link[q]=link[cur]=clone;
        }

    }
    last=cur;
}

原文地址:https://www.cnblogs.com/dengyixuan/p/8283682.html

时间: 2024-08-05 18:16:24

学习笔记(SAM)的相关文章

SpringMVC学习笔记(二): 日常使用功能

前提: 1.web.xml 和spring-mvc核心配置如:SpringMVC学习笔记(一): 基础知识中注解实现. 2.类的@RequestMapping(value="/annotationController") 3.spring-mvc 推荐使用注解实现. 一.数据的接收 (一)URL参数数据的接收 1.使用 HttpServletRequest 获取参数 <span style="font-size:18px;"><span style

&lt;老友记&gt;学习笔记

这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的情路坎坷,事业成败和生活中的喜怒哀乐,无时无刻不牵动着彼此的心,而正是正平凡的点点滴滴,却成为最令人感动与留恋的东西. 人物:1.瑞秋•格林(RACHEL GREENE)由珍妮佛•安妮斯顿(Jennifer Aniston)扮演 瑞秋是莫妮卡的高中同学,在与牙医未婚夫的婚礼上脱逃至莫妮卡处. 2.罗

JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的文章,大多都是以罗列记忆点的形式书写的,没有谈论实现细节和逻辑原理.作为个人笔记无可厚非,但是并不利于他人学习.希望能通过这种比较“费劲”的讲解,帮助我自己.也帮助读者们更好地学习Java.掌握Java. 无论你跟我一样需要应聘,还是说在校学生学习Java基础,都对入门和进一步启发学习有所帮助.(关

NLTK学习笔记(五):分类和标注词汇

[TOC] 词性标注器 之后的很多工作都需要标注完的词汇.nltk自带英文标注器pos_tag import nltk text = nltk.word_tokenize("And now for something compleyely difference") print(text) print(nltk.pos_tag(text)) 标注语料库 表示已经标注的标识符:nltk.tag.str2tuple('word/类型') text = "The/AT grand/J

学习笔记一

1,黑客,技术比较牛的一种人,斯托曼,程序员:史蒂夫,苹果计算机之一 2,骇客,干坏事的一群人,恶意破解商业软件,恶意入侵别人的网站等事务,凯文 头号电脑骇客: 3,红客,中国特有,自发的民间组织,用自己的技术维护国内网络安全 4,白帽子,专门从事网络安全的人,受雇于安全公司 4,查漏洞的,攻击网络或者计算机 6,处于之间,自由的,道德底线比较高 7,脚本(asp,php,jsp) 2,html(css,js, html)超文本传输协议 3,HTTP协议 4,CMS(B/S)网站内容管理系统,一

XML学习笔记(五):使用 jdom和dom4j 解析XML

XML解析的详细分析与jaxp解析XML详见:XML学习笔记(四):使用 DOM和SAX 解析XML 一.JDom 1.创建XML文件: 1)Document类即代表整个XML文档,把生成的 Document 利用 XMLOutputter 类输出即可. 2)映射关系:元素:Element:属性:Attribute:注解:Comment:文本信息:Text: 3)注意:addContent()是追加,setContent()会覆盖. /** * 创建XML * * @throws IOExcep

Jade学习笔记

初学nodejs,折腾过用handlebars做模板,后来隔了一段重新学习,用了jade,真心简洁……记录一些学习笔记,以备复习. jade是基于缩进的,所以tab与space不能混用: 属性的设置:link(rel='stylesheet', href='/stylesheets/style.css'); 变量的定义:- var users = ["Sally","Joseph","Sam","Mike"]  不要var也可

《C++ Primer Plus》学习笔记6

<C++ Primer Plus>学习笔记6 第11章 使用类 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<&

typescript handbook 学习笔记4

概述 这是我学习typescript的笔记.写这个笔记的原因主要有2个,一个是熟悉相关的写法:另一个是理清其中一些晦涩的东西.供以后开发时参考,相信对其他人也有用. 学习typescript建议直接看中文文档或英文文档.我是看的英文文档. typescript handbook 学习笔记3 类 基本使用 class Greeter { //只读,必须在声明的时候或者constructor里面初始化 readonly greeting: string; //constructor里面的只读 con

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main