POJ3630 字典树

由于动态开辟内存会引致超时,所有需要预先申请一大片内存。字典树详解请见上一篇博文。

View Code
 1 #include <iostream>
2 #include <cstring>
3 #define branchNum 11
4 using namespace std;
5
6 int k;//记录使用了的Tnode
7
8 struct Trie_node
9 {
10 Trie_node *next[branchNum];
11 bool isStr;
12 }Tnode[100050];
13
14 class Trie
15 {
16 private:
17 Trie_node *root;
18 public:
19 Trie()
20 {
21 root = &Tnode[0];
22 }
23 bool insert(const char *num)//ruturn false表示存在前缀号码
24 {
25 Trie_node * location = root;
26 while(*num)
27 {
28 if(location->next[*num-'0'] == NULL)//如果没有指向Tnode,则建立
29 {
30 location->next[*num-'0'] = &Tnode[++k];
31 memset(Tnode[k].next, NULL, sizeof(Tnode[k].next));//初始化点
32 Tnode[k].isStr = false;
33 }
34 else if(*(num+1) == '\0')//插入的号码串a比存在的号码串b短,a是b前缀的情况
35 {
36 return false;
37 }
38 location = location->next[*num-'0'];
39 if(location->isStr)//插入的号码串a比存在的号码串b长,b是a前缀的情况
40 {
41 return false;
42 }
43 num++;
44 }
45 location->isStr = true;//最后标记字符串完结
46 return true;
47 }
48 };
49
50 int main()
51 {
52 Trie t;
53 char ph[11];
54 int test, n, flag;
55 scanf("%d",&test);
56 while(test--)
57 {
58 flag = 1; k = 0;
59 scanf("%d",&n);
60 memset(Tnode[0].next, NULL, sizeof(Tnode[0].next));
61 while(n--)
62 {
63 scanf("%s",ph);
64 if(!t.insert(ph))
65 {
66 flag = 0;
67 }
68 }
69 if(flag) printf("YES\n");
70 else printf("NO\n");
71 }
72 return 0;
73 }

更详细的解题报告请参考博文:

http://www.cnblogs.com/cherish_yimi/archive/2009/10/12/1581795.html

感谢原作者的博文,让本人学会了字典树。

posted @ 2012-03-10 13:36  Veegin  阅读(204)  评论(0编辑  收藏  举报