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 字典树的主要内容,如果未能解决你的问题,请参考以下文章