字典树数组模板

自己实在太懒了,就没有自己再写一份代码,这是另一个博客上直接找来的,它的数组模板写的挺好的,指针模板一般般吧!~~

http://blog.csdn.net/king_cannon_fodder/article/details/77175620

///这里以输入字符串后,查询字符串出现的次数为例
#include <bits/stdc++.h>
#define maxn 1000000
using namespace std;

struct Trie
{
    int next[26];///表示下一个节点是否存在,
    int val;///节点的数据域,可根据需要进行改变
} tree[maxn];
int nxt;///nxt表示节点的编号
char str[26];///存储输入的字符串
int add()
{
    ///建立新的节点
    memset(&tree[nxt], 0, sizeof(Trie));
    return nxt++;
}
void Insert(char *s)///插入以及建树
{
    int rt = 0, len = strlen(s);
    for(int i = 0; i < len; i++)
    {
        int c = s[i] - ‘a‘;
        if(!tree[rt].next[c])
        {
            ///如果树中还不存在这个节点,就开辟新的节点
            tree[rt].next[c] = add();
        }
        rt = tree[rt].next[c];
    }
    tree[rt].val++;///维护数据域(这个表示出现的次数)
}

bool Find(char *s)
{
    ///查找字符串是否存在
    int rt = 0, len = strlen(s);
    for(int i = 0; i < len; i++)
    {
        int c = s[i] - ‘a‘;
        if(!tree[rt].next[c])
            return false;
        rt = tree[rt].next[c];
    }
    if(tree[rt].val)
        return true;
    return false;
}
int main()
{
    int T;
    memset(&tree[0], 0, sizeof(Trie));
    nxt = 1;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%s", str);
        Insert(str);
    }
    while(~scanf("%s", str))
    {
        if(Find(str))
            puts("exist");
        else
            puts("none");
    }
    return 0;
}

  数组模板其实就是模拟指针!~!~

原文地址:https://www.cnblogs.com/Y-Meng/p/8587998.html

时间: 2024-10-12 07:23:13

字典树数组模板的相关文章

字典树(模板)

Trie树(来自单词retrieval),又称前缀字,单词查找树,字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构. 字典树是处理字符串常见的一种树形数据结构,其优点是利用字符串的公共前缀来节约存储空间 字典树完整结构 实际上每个节点的子节点都应该从0编到——25,但这样会发现许多事根本用不到的.比如上图的根节点应该分出26个叉.节约空间,用到哪个分哪个. 字典树建树: 字典树理解 模板: 一.建树 void insert()//插入单词s { len=strlen(s

01字典树及其模板

模板 : const int Bit = 32; struct Trie { Trie *ch[2]; LL v; inline void init(){ for(int i=0; i<2; i++) this->ch[i] = NULL; this->v = -1; } }; Trie *root;///记得在 main 函数的时候分配空间给 root 并初始化 inline void CreateTrie(LL x) { Trie * p = root, *tmp; for(int

字典树(模板

学完字典树后 还是背不住模板…………介绍写在代码里———— struct Trie{ ll ch[N][26],sz,val[N]; //val为附加信息 //这里的ch数组,第二维的大小为26是因为字符串只由小写字母构成,第二维的大小一般是由字符串的组成决定 //sz即为节点编号 Trie(){ sz=1;//一开始的时候只有根节点这一个节点 memset(ch[0],0,sizeof(ch[0])); memset(val,0,sizeof(val)); }//这里是初始化 ll idx(c

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

Intelligent IME Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4776    Accepted Submission(s): 2227 Problem Description We all use cell phone today. And we must be familiar with the intelligen

HDU 1251 统计难题(字典树入门模板题 很重要)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 56382    Accepted Submission(s): 19709 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

字典树以及模板

字典树又称为单词查找树.用于统计排序大量字符串(不限于字符串),利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高.字典树的性质: 1.根节点不包含任何字符(空根节点) 2.从根节点到某一节点路径上的字符连起来就是一个字符串 3.每个节点的所有子节点包含的字符串不相同. 一般的每一个节点需要一个统计量count,来记录当前前缀重复的次数.每个节点还可以用一个布尔变量标记当前节点是否构成单词.Trie主要操作有插入单词,删除单词,查找单词. #define _C

字典树数组形式写法

第一题: Remember the Word Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Neal is very curious about combinatorial problems, and now here comes a problem about words. Knowing that Ray has a photographi

trie树(字典树)模板

参考:http://www.cnblogs.com/tanky_woo/archive/2010/09/24/1833717.html #include<iostream> #include<string.h> using namespace std; const int MAX=26; struct Trie { Trie *next[MAX]; int v; //根据需要变化,1代表无此单词,-1代表有此单词 }; Trie *root=new Trie; void creat

字典树【模板】

struct TrieNode { int Count;<span style="white-space:pre"> </span>//前缀单词出现次数 struct TrieNode* Next[26];<span style="white-space:pre"> </span>//26个字母节点 }Tree,*Trie; TrieNode *root; void Create() //初始化 { root = ne