hdu杭电1671 / poj3630 字典树

Posted %%%%%

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu杭电1671 / poj3630 字典树相关的知识,希望对你有一定的参考价值。

传送门

题意:输入n串数字 找出是否有前缀相同的串 如果存在 输出NO否则输出YES

思路:用字典树解决 标记字典树总串的结尾 查找出一个串内部是否有被标记的节点 如果有那么说明存在前缀相同的串

在插入字典树的时候判断是否存在

AC代码:

 

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

 

以上是关于hdu杭电1671 / poj3630 字典树的主要内容,如果未能解决你的问题,请参考以下文章

POJ-3630-Phone List(字典树)

HDU1671 字典树

字典树模板+HDU 1671 ( Phone List )(字典树)

POJ3630-Phone List-(字典树)

(字典树)HDU - 1671 Phone List

HDU1671 水题字典树