zoukankan      html  css  js  c++  java
  • Thematic002.字符串专题

    目录

    • Trie字典树
    • KMP
    • AC自动机
    • Manacher
    • 回文自动机
    • 后缀数组
    • 后缀自动机

    Trie字典树

    概念

    我们先来看看什么是Trie字典树

    可以发现,这棵树的每一条边都有一个字符

    有一些点是黄色的,表示它们被标记了

    那么,哪些字符串在这棵树中出现过呢?

    从树的根节点到每一个被标记的点的路径上的字符串就是对应黄色点所表示的字符串

    举个例子,(5) 是一个被标记的点

    说明这一条从根节点到 (5) 的路径 ( (1 ightarrow2 ightarrow5) )上的字符串,也就是 ad ,就在这棵树内

    插入字符串(构建Trie字典树)

    • 步骤

    1. 初始化

    新建一个根节点 (1)

    2. 插入字符串

    我们从根节点开始,即 now=1

    接着看与 now 点相连的边中有没有字符为 s

    • 如果有,跟着这条边走,即 now=s的点编号

    • 如果没有,新建一个点,即 now=++cnt (cnt为点的数量)

    最后,标记终点,即 over[now]=true

    • 例子

    我们现在要往一个空的Trie字典树里插入 beep

    1.now=1 ,向下查找,发现没有 b ,插入 bnow=++cnt=2

    2.now=2 ,向下查找,发现没有 e ,插入 enow=++cnt=3

    3.now=3 ,向下查找,发现没有 e ,插入 enow=++cnt=4

    4.now=4 ,向下查找,发现没有 p ,插入 pnow=++cnt=5

    5.now=5 ,结束,标记 (5)

    现在,往里面继续插入 bed

    6.now=1 ,向下查找 ,发现有 b ,跟着走 ,now=2

    7.now=2 ,向下查找 ,发现有 e ,跟着走 ,now=3

    8.now=3 ,向下查找 ,发现没有 d ,插入 dnow=++cnt=6

    9.now=6 ,结束 ,标记 (6)

    • 代码

    bool over[maxn];
    int cnt=0,trie[maxn][maxm];
    
    void Insert(string str)
      {
        int now=1;
        for(int i=0;i<str.size();i++)
        {
            int next=str[i]-'a';
            if(!trie[now][next])
                trie[now][next]=++cnt;
            now=trie[now][next];
        }
        over[now]=true;
      }
    

    KMP


    AC自动机


    Manacher


    回文自动机


    后缀数组


    后缀自动机

  • 相关阅读:
    spring学习之模拟spring(spring原理解析)-01.xml文件的解析
    存储过程学习
    对象的深浅拷贝
    JavaScript 面向对象编程思想(二)
    深层剖析JavaScript 一
    深入剖析 css
    Vuex 总结
    h5 微信授权
    LeetCode
    echarts-liquidfill
  • 原文地址:https://www.cnblogs.com/666DHG/p/Thematic002.html
Copyright © 2011-2022 走看看