POJ 3630 Phone List(Trie树,静态数组实现)
2012-09-03 20:46
302 查看
/* 这道题动态分配内存会超时 先建图,建图完成后,再判断,这样不容易出错 */ /* 解法一: Trie树,静态数组实现 */ #include <cstdio> #include <cstring> const int nMax = 200000; struct Trie { Trie *next[10]; int count; }trie[nMax]; int pos; void buildTrie(char *s, int len) { Trie *p = &trie[0]; int i; for(i = 0; i < len; ++ i) { int index = s[i] - '0'; if(p->next[index] == NULL) p->next[index] = &trie[pos ++];//模拟动态分配内存 p = p->next[index]; } p->count ++; } bool judge(Trie *root)//学会使用函数的返回值,减少全局变量的使用有时候可以简化程序复杂度 { int i; if(root->count > 1) return 1; for(i = 0; i < 10; ++ i) { if(root->next[i]) { if(root->count > 0) return 1; if(judge(root->next[i])) return 1;//原来这里没有做处理 } } return 0; } int main() { //freopen("e://data.in", "r", stdin); int T; scanf("%d", &T); while(T --) { int N; scanf("%d", &N); int i; char s[15]; pos = 1; memset(trie, 0, sizeof(trie));//memset可以对数组进行初始化 for(i = 0; i < N; ++ i) { scanf("%s", s); int len = strlen(s); buildTrie(s, len); } printf("%s\n", judge(&trie[0]) ? "NO" : "YES"); } return 0; } /* 解法二:哈希表实现 */ #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int HASH = 12007; int T, N; char s[10007][15]; int flag; char hash[HASH][15]; int head[HASH]; int fhash(char *s, int len) { int p = 0; int i; for(i = 0; i < len; ++ i) p = (p * 10 + s[i] - '0') % HASH; return p; } int insert(char *s, int len) { int p = fhash(s, len); while(head[p] != 0 && strcmp(s, hash[p]) != 0) { p = (p + 1) % HASH; } if(head[p] == 0) { strcpy(hash[p], s); head[p] = 1; return 1; } return 0; } bool isFind(char *s, int len) { char ss[15]; int i; for(i = 0; i < len; ++ i) ss[i] = s[i]; ss[len] = '\0'; int p = fhash(ss, len); while(head[p] != 0 && strcmp(ss, hash[p]) != 0) { p = (p + 1) % HASH; } if(head[p] == 0) { return 0; } return 1; } int main() { //freopen("e://data.in", "r", stdin); int T; scanf("%d", &T); while(T --) { memset(head, 0, sizeof(head)); scanf("%d", &N); int i, j; int len; flag = 0; for(i = 0; i < N; ++ i) { scanf("%s", s[i]); if(flag == 0) { len = strlen(s[i]); if(!insert(s[i], len)) { flag = 1; } } } for(i = 0; i < N && !flag; ++ i) { len = strlen(s[i]); for(j = 1; j < len && !flag; ++ j) if(isFind(s[i], j)) flag = 1; } if(flag) printf("NO\n"); else printf("YES\n"); } return 0; }
相关文章推荐
- poj 3630 Phone List trie树—字典树 静态数组版!!!
- 【原】 POJ 3630 Phone List Trie树 解题报告
- poj_3630 Phone List(Trie树练习)
- HDU 1671 && POJ 3630 Phone List (Trie树 好题)
- POJ-3630-Phone List-Trie树(键树、数字查找树、基数树)
- poj - 3630 - Phone List(数组Trip)
- POJ_3630_Phone List_Trie树
- POJ 3630 Phone List(trie树的简单应用)
- Phone List (POJ_3630) 静态字典树 + 模板题
- POJ 3630 Phone List 静态字典树Trietree
- Phone List POJ - 3630(静态 , 与 动态)
- POJ-3630 Phone List Trie树 | qsort
- 【POJ 3630】Phone List(静态字典树)
- POJ 3630 && HDU 1671 Phone list(静态字典树)
- 【POJ】3630 - Phone List(字典树(静态建树))
- POJ 3630 Phone List 【Trie树入门】
- POJ 3630 && HDU 1671 Phone list(静态字典树)
- POJ 3630 Phone List 【Trie树入门】
- poj 3630 Phone List trie树
- Trie树学习小记 Poj 3630 & Hdu1671 Phone List