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 }