静态字典树

    

  动态字典树每次都要new一个内存来操作,所以耗时也是较多的;所以我们可以先一次性开辟出足够的空间,然后模拟动态字典树的创建查找过程来写出相应的静态字典树。

代码都差不多,主要是你得先学会了动态字典树;接下来的事情就是模拟了,,,模拟,,模拟。

结构定义:

struct Trie
{
    int next[26];
    int cnt;           // 根据需要灵活变动
    void Init()
    {
        cnt = 0;
        _clr(next, 0);
    }
}trie[N];
int size;   // 节点标知

字典树创建:

 1 void Insert(char *s)
 2 {
 3     int Pre = 0;
 4     for(int i=0; s[i]; i++)
 5     {
 6         int id = s[i] - ‘a‘;
 7         if(trie[Pre].next[id]==0)
 8         {
 9             trie[Pre].next[id] = ++ size;  // 节点不存在开辟新节点
10             Pre = size;         // 继续向下查找
11             /*
12              *  根据需要添加
13             */
14             trie[Pre].cnt++;    // 根据需要添加
15         }
16         else
17         {
18             Pre = trie[Pre].next[id]; // 向下传递
19              /*
20              *  根据需要添加
21             */
22             trie[Pre].cnt++;
23         }
24     }
25}

查找:

 1 int Find(char *s)
 2 {
 3     int Pre = 0;
 4     for(int i=0; s[i]; i++)
 5     {
 6         int id = s[i] - ‘a‘;
 7         if(trie[Pre].next[id]==0)
 8             return 0;
 9         Pre = trie[Pre].next[id];
10     }
11     return trie[Pre].cnt;
12 }

以poj 3630为例:http://poj.org/problem?id=3630

 1 #include <cstdio>
 2 #include <cstring>
 3 #define _clr(x, y) memset(x, y, sizeof(x))
 4 #define N 100005
 5 using namespace std;
 6 struct Trie
 7 {
 8     int next[10];
 9     int suffix;
10     void init()
11     {
12         suffix = 0;
13         _clr(next, 0);
14     }
15 }trie[N];
16 int size;
17
18 void Init()
19 {
20     size = 0;
21     for(int i=0; i<N; i++)
22         trie[i].init();
23 }
24 //  存在前缀返回false
25 bool Insert(char *s)
26 {
27     int Pre = 0;
28     bool tag = true;
29     for(int i=0; s[i]; i++)
30     {
31         int id = s[i] - ‘0‘;
32         if(trie[Pre].next[id]==0)
33         {
34             tag = false;
35             trie[Pre].next[id] = ++size;
36             Pre = size;
37         }
38         else
39         {
40             Pre = trie[Pre].next[id];
41             if(trie[Pre].suffix)     // 前面是当前的前缀
42                 return false;
43         }
44     }
45     trie[Pre].suffix = true;
46     return !tag;               //当前是否为前面的前缀
47 }
48
49 int main()
50 {
51     int T, n;
52     char str[14];
53     scanf("%d", &T);
54     while(T--)
55     {
56         bool tag = true;
57         Init();
58         for(int i=0; i<N; i++)
59             trie[i].init();
60         scanf("%d", &n);
61         while(n--)
62         {
63             scanf("%s", str);
64             if(tag)
65                 tag = Insert(str);
66         }
67         puts(tag ? "YES":"NO");
68     }
69     return 0;
70 }

时间: 2024-09-29 00:42:45

静态字典树的相关文章

poj 3630 Phone List (字典树 +静态字典树)

Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22235   Accepted: 6885 Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogu

静态字典树模板

#include <iostream> #include <cstring> #include <cstdio> using namespace std; int pos; struct node { int child[26]; }tree[10000010]; int add() { pos++; for(int i=0;i<26;i++) { tree[pos].child[i]=-1; } return pos; } int inser(char* str

Trie字典树 静态内存

静态字典树 看了好久的字典树,挺简单的一个结构,愣是看了这么久才写出来... 专心一点就不会这样了.... 接下来就去刷刷字典树的题吧....... 下面是字典树.... 定义节点 typedef struct Trie{ char val;  //其实这东西没啥软用...注释掉也一样...没有变化 bool isword; struct Trie *next[26];}*Trie_pointer; 然后建树 这几天抽风了... 把memset写在函数外面去了.... 编译老半天过不去....

POJ 1451 T9 字典树

题意和手机的九键输入法一样.输入数据第一行给出有多少组测试数据,每组数据第一行给出w(0<=w<=1000),接下来w行给出一个单词以及该单词的出现频率p(1<=p<=100),每个单词的最大长度不超过100个字母:然后,给出一个整数m,接下来m行给出一个输入串,代表在手机上按了哪些键,每个输入串最多有100个字符,且以数字1作为结尾.要求根据给出输入串,输出在按这些键的过程中,输入法给出的首选项(即出现频率最高的单词),若没有对应输入的单词,则输出"MANUALLY&q

【字典树应用】联想用户最想输入的词汇

第一章:抛砖引玉 字典树是一种基于链表的数据结构,以统计词频并返回用户最想输入的词汇为例,分享一下字典树的应用心得. 刚建立的用户词库,用户输入两次"hilili", 输入一次"hilucy",此时用户再次输入"hi",我们应该联想到用户可能要输入的单词是"hilili",以下为统计示例图. 字典树是一种兼顾空间和时间的数据结构,利用公共前缀节约空间,减少比较次数以提高查询和插入效率. 字典树的常见用途:保存大量字符串并进行统

HDU 4825 Xor Sum(经典01字典树+贪心)

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 1555    Accepted Submission(s): 657 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Ze

(字典树)HDU - 1251 统计难题

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意:先给定一些单词构成字典,然后再查一些在字典中以一些字母串为前缀的单词有几个. 分析:很基础很普通的字典树题目,但是用动态的字典树会超时,所以要用静态的字典树. 代码: 1 #include <set> 2 #include <map> 3 #include <list> 4 #include <cmath> 5 #include <queue&

[POJ] #1003# 487-3279 : 桶排序/字典树(Trie树)/快速排序

一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 Description Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or

字典树(Trie Tree)

在图示中,键标注在节点中,值标注在节点之下.每一个完整的英文单词对应一个特定的整数.Trie 可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的.键不需要被显式地保存在节点中.图示中标注出完整的单词,只是为了演示 trie 的原理. trie 中的键通常是字符串,但也可以是其它的结构.trie 的算法可以很容易地修改为处理其它结构的有序序列,比如一串数字或者形状的排列.比如,bitwise trie 中的键是一串位元,可以用于表示整数或者内存地址. Trie树是一种树形结