Trie树(字典树)总结

一、Trie树的作用:

(1)用于存储、插入(更新)、查询字符串

(2)用于解决前缀问题

(3)解决二进制问题(01Trie树)

二、Trie树模板:

(1)用结构体写的:

#include 
#include 
#include 
using namespace std;
const int next_cnt=26;//next_cnt可以根据题目要求的不同的字符集变化,这里选择了26个英文字母
const int N=100010;
int trie_cnt;

struct trie{
    int tag;
    int next[next_cnt];
    void init(){
        tag=0;
        memset(nexr,-1,sizeof(next));
    }
}trie[N];

void init(){//多case的时候可以用于更新trie数组
    trie_cnt=0;
    trei[0].init();
}

void insert(string s){
    int len=s.length(),root=0;
    for(int i=0;i

(2)用二维数组写的:

#include 
#include 
#include 
using namespace std;
const int N=100010;
int son[N][26],cnt;//cnt是节点的编号数
int tag[N];//tag数组在这里起标记作用,如果题目要求字符串出现的次数,则可以修改一下tag数组的含义,既能统计次数,也能做标记

void insert(string s){
    int len=s.length(),root=0;
    for(int i=0;i

 下面贴几道一般的Trie树题目:

        P2580 于是他错误的点名开始了        AcWing 835. Trie字符串统计

三、特殊的Trie树:01Trie树

01Trie树是用于解决二进制问题,一般用于维护与异或相关的问题

下面放一道题目:

        AcWing 143. 最大异或对 (已做笔记)

这个最大异或的问题在洛谷有一个hard版本,涉及到前向星建树的操作,我现在根本不会,所以等以后再把它搞懂qwq

           

四、处理前缀问题的Trie树:        

处理前缀问题一般都是边插入,边判断的。而且需要同时考虑该串是否为别的串的子串别的串是否为该串的子串,不要遗漏

直接上题目:        PHONELST - Phone List(已做笔记)        AcWing 142. 前缀统计(已做笔记)

你可能感兴趣的:(数据结构,算法,c++)