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

Trie树

时间:2015-02-06 16:38:28      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

问题描述:

Trie树在字符串处理中的应用十分重要,最典型的应用就是输入法和搜索引擎中的字符串自动补全功能。其核心思想是用一颗树来存储一个字典,树的每一条边表示单词的一个字符,在每个节点上记录以从根节点到当前节点所经过的路径为前缀的字符串个数。

利用字典树,可以实现O(log(n))的单词插入、单词查询、查询以某个前缀开头的字符串数目等。

题目链接:http://hihocoder.com/problemset/problem/1014

我的代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 #define MAX_CH 26
 7 #define MAX_NODE 1000005
 8 
 9 int nodecnt;
10 
11 struct TrieNode
12 {
13     int cnt;
14     TrieNode *p[MAX_CH];
15     void init()
16     {
17         cnt = 0;
18         for(int i=0; i<MAX_CH; ++i) p[i] = NULL;
19     }
20     int query(char *s)
21     {
22         int idx = s[0]-a;
23         if(p[idx]!=NULL)
24         {
25             if(s[1]==\0) return p[idx]->cnt;
26             else return p[idx]->query(s+1);
27         }
28         else
29         {
30             return 0;
31         }
32     }
33 }t_node[MAX_NODE];
34 
35 struct Trie
36 {
37     TrieNode *rt;
38     void init()
39     {
40         rt = &t_node[0];
41         rt->init();
42         nodecnt = 1;
43     }
44     void insert(char *s)
45     {    
46         TrieNode *now = rt;    
47         for(int i=0; s[i]; ++i)
48         {
49             int idx = s[i]-a;
50             if(now->p[idx]==NULL)
51             {
52                 now->p[idx] = &t_node[nodecnt++];
53                 now->p[idx]->init();
54             }
55             ++(now->p[idx]->cnt);
56             now = now->p[idx];
57         }
58     }
59     int query(char *s)
60     {
61         return rt->query(s);
62     }
63 }trie;
64 
65 int main()
66 {
67     int n, m;
68     char s[20];
69     while(scanf("%d", &n)!=EOF)
70     {
71         trie.init();
72             
73         while(n--)
74         {
75             scanf("%s", s);
76             trie.insert(s);
77         }
78         
79         scanf("%d", &m);
80         while(m--)
81         {
82             scanf("%s", s);
83             printf("%d\n", trie.query(s));
84         }
85     }    
86     return 0;
87 }

 

Trie树

标签:

原文地址:http://www.cnblogs.com/pczhou/p/4277297.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!