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

hdu杭电1671 / poj3630 字典树

时间:2016-09-14 01:41:28      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

传送门

题意:输入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 字典树

标签:

原文地址:http://www.cnblogs.com/max88888888/p/5870309.html

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