字典树模板( 指针版 && 数组版 )

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典树模板( 指针版 && 数组版 )相关的知识,希望对你有一定的参考价值。

模板 : 

技术分享
#include<string.h>
#include<stdio.h>
#include<malloc.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 26;

struct Trie
{
    Trie *Next[maxn];
    int v;
    inline void init(){
        this->v = 1;
        for(int i=0; i<maxn; i++)
            this->Next[i] = NULL;
    }
};
Trie *root = (Trie *)malloc(sizeof(Trie));

void CreateTrie(char *str)
{
    int len = strlen(str);
    Trie *p = root, *tmp;
    for(int i=0; i<len; i++){
        int idx = str[i]-a;

        if(p->Next[idx] == NULL){
            tmp = (Trie *)malloc(sizeof(Trie));
            tmp->init();
            p->Next[idx] = tmp;
        }else p->Next[idx]->v++;

        p = p->Next[idx];
    }
    p->v = -1;//若为结尾,则将v改成-1,当然字典树里面的变量都是要依据题目
              //设置并且在特定位置赋值的
}

int FindTrie(char *str)
{
    int len = strlen(str);
    Trie *p = root;
    for(int i=0; i<len; i++){
        int idx = str[i]-a;
        p = p->Next[idx];
        //...进行一系列操作
    }
}

inline void DelTrie(Trie *T)
{
    if(T == NULL) return ;
    for(int i=0; i<maxn; i++){
        if(T->Next[i] != NULL)
            DelTrie(T->Next[i]);
    }
    free(T);
    return ;
}

int main(void)
{
    root.init();//!!!
    //...
}
指针版

 

技术分享数组版

 

字典树算法参考 ==> http://www.cnblogs.com/tanky_woo/archive/2010/09/24/1833717.html

以上是关于字典树模板( 指针版 && 数组版 )的主要内容,如果未能解决你的问题,请参考以下文章

[模板]洛谷T3369 普通平衡树 链表&递归版无父指针版Splay

codevs 4244 平衡树练习

算法#3树状数组&二叉索引树

ACM模板

HDU 4287 Intelligent IME(字典树数组版)

「Splay」指针版与数组版模板