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

Thematic002.字符串专题

时间:2020-01-28 23:35:40      阅读:41      评论:0      收藏:0      [点我收藏+]

标签:字典   kmp   ac自动机   回文   插入字符串   新建   void   有一个   string   

目录

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

Trie字典树

概念

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

技术图片

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

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

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

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

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

说明这一条从根节点到 \(5\) 的路径 ( \(1\rightarrow2\rightarrow5\) )上的字符串,也就是 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


回文自动机


后缀数组


后缀自动机

Thematic002.字符串专题

标签:字典   kmp   ac自动机   回文   插入字符串   新建   void   有一个   string   

原文地址:https://www.cnblogs.com/666DHG/p/Thematic002.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!