hdu1671Phone List(字典树模板)
2017-08-18 13:54
387 查看
题意:
给你n个字符串,判断存不存在任意两个字符串,其中一个是另一个的前缀;
思路:
建立一个Trie树,val是否为1来判断存不存在根节点到当前节点有一个字符串。
遍历到val为1的节点 或者 遍历到末尾时还存在节点时 输出yes。注意释放内存
代码:
给你n个字符串,判断存不存在任意两个字符串,其中一个是另一个的前缀;
思路:
建立一个Trie树,val是否为1来判断存不存在根节点到当前节点有一个字符串。
遍历到val为1的节点 或者 遍历到末尾时还存在节点时 输出yes。注意释放内存
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int flag; struct trie { trie *next[11]; int val; }; void ins(trie *p,char *str) { int len = strlen(str); int i = 0; while(i<len) { trie *temp; temp = p->next[str[i]-'0']; if(i!=len-1) { if(temp==NULL) { temp = new trie; temp->val = 0; for(int j = 0;j<=9;j++) temp->next[j] = NULL; p->next[str[i]-'0'] = temp;; } else { if(temp->val==1) flag = 1; } p = p->next[str[i]-'0']; } else { if(temp!=NULL) flag = 1; else { temp = new trie; temp->val = 1; for(int j = 0;j<=9;j++) temp->next[j] = NULL; p->next[str[i]-'0'] = temp; } } i++; } } void del(trie *p) { for(int i = 0;i<=9;i++) if(p->next[i]!=NULL) del(p->next[i]); delete p; } int main() { int t; scanf("%d",&t); while(t--) { int n; flag = 0; scanf("%d",&n); getchar(); trie* root = new trie; root->val = 0; for(int i = 0;i<=9;i++) { root->next[i] = NULL; } char phone[11]; for(int i = 0;i<n;i++) { scanf("%s",phone); if(!flag) ins(root,phone);//插入 } if(flag) printf("NO\n"); else printf("YES\n"); del(root);//释放内存 } return 0; }
相关文章推荐
- hdu1251 字典树trie 模板题
- 字典树(Trie树)模板
- HDU 1251 统计难题 (字典树基本模板,有详细注释)
- 【Trie】Trie字典树模板 静态指针池、数组写法
- 1251 字典树 模板
- hdu 1671 字典树 模板
- 字典树模板(hdu1251)
- 字典树 模板+讲解
- 字典树——字典树树模板
- 寒假集训——字典树(模板)
- 字典树模板
- HDU 1671 Phone List(字典树模板)
- hdu 1251 字典树模板题 ---多串 查找单词出现次数
- Trie Tree (字典树)的简单使用 与 模板。
- 字典树-模板
- HDOJ5687 字典树模板,数组实现
- 字典树模板
- LA-3942 (字典树模板)
- 字典树(trie)模板
- 字典树模板