Trie字典树 静态内存

静态字典树 

看了好久的字典树,挺简单的一个结构,愣是看了这么久才写出来。。。

专心一点就不会这样了。。。。

接下来就去刷刷字典树的题吧。。。。。。。

下面是字典树。。。。

定义节点

typedef struct Trie{
char val;  //其实这东西没啥软用。。。注释掉也一样。。。没有变化
bool isword;
struct Trie *next[26];
}*Trie_pointer;

然后建树

这几天抽风了。。。

把memset写在函数外面去了。。。。

编译老半天过不去。。。。

日了。。。。。。。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define mem(a) memset(a,0,sizeof(a))
 4 #define long long ll;
 5 
 6 typedef struct Trie{
 7     char val;
 8     bool isword;
 9     struct Trie *next[26];
10 }*Trie_pointer;
11 
12 Trie trie[200000];
13 
14 int tot;
15 
16 Trie_pointer CreateNode()
17 {
18     return &trie[tot++];
19 }
20 
21 void Insert(Trie_pointer root, char *s)
22 {
23     if(*s == '\0')
24         return;
25     char *p = s;
26     Trie_pointer tmp,t = root;
27     while(*p != '\0')
28     {
29         if(t->next[*p - 'a'] == NULL)
30         {
31             tmp = CreateNode();
32             tmp->val = *p;
33             t->next[*p - 'a'] = tmp;
34         }
35         t = t->next[*p - 'a'];
36         p++;
37     }
38     t->isword = 1;
39 }
40 
41 bool Search(Trie_pointer root, char *s)
42 {
43     Trie_pointer tmp,t = root;
44     if(*s == '\0')
45         return false;
46     while(*s != '\0')
47     {
48         if(t->next[*s - 'a'] ==NULL)
49             return false;
50         t = t->next[*s -'a'];
51         s++;
52     }
53     if(t->isword == 0 )
54         return false;
55     return true;
56 }
57 
58 int main()
59 {
60     Trie root;
61     char s[20];
62     int i,n;
63     mem(trie,0,sizeof(trie));
64     mem(&root,0,sizeof(root));
65     cin>>n;
66     for(i=1; i<=n; i++)
67     {
68         cin>>s;
69        Insert(&root,s);
70     }
71     while(cin>>s)
72     {
73         bool flag = Search(&root,s);
74         if(flag)
75             printf("YES\n");
76         else
77             printf("NO\n");
78     }
79     return 0;
80 }

 

posted on 2016-09-13 20:01  lazzzy  阅读(394)  评论(0编辑  收藏  举报

导航