首页 > 代码库 > hdu杭电1671 / poj3630 字典树
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 Trie11 {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 else72 printf("YES\n");73 flag = 0;74 }75 return 0;76 }
hdu杭电1671 / poj3630 字典树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。