POJ1056 IMMEDIATE DECODABILITY & POJ3630 Phone List
2013-10-28 10:53
197 查看
题目来源:http://poj.org/problem?id=1056
http://poj.org/problem?id=3630
两题非常类似,所以在这里一并做了。
1056题目大意:
如果一组编码中不存在一个编码是另一个编码的前缀的情况,我们就称这组编码是“可立即解码的”(immediately decodable)。我们假定编码都是二进制的,一组编码中没有相同的码。每个编码长度都不超过10,每组编码数目都在2到8之间。
比如,一组二进制编码:{A, B, C, D},其中:A: 01 B: 10 C: 0010 D: 0000,这组编码是immediately decodable的;另一组编码:A: 01 B: 10 C: 010 D:0000 则不是immediately decodable的, 因为A是C的前缀。
写一个程序判断一组编码是不是immediately decodable的。
输入:由一组0和1组成的二进制码组成,以一个9表示一组编码的输入结束。
输出:格式见sample。
Sample Input
Sample Output
本题数据类型简单,数据规模小,暴力其实就可以过。但是本题如果不用前缀树做就显得没有价值了。
Trie树,又称前缀树或字典树。Trie一词本来源于retrieval,发音[tri],但似乎更多人读为[trai]。看一下维基上的示意图应该很容易理解。
View Code
http://poj.org/problem?id=3630
两题非常类似,所以在这里一并做了。
1056题目大意:
如果一组编码中不存在一个编码是另一个编码的前缀的情况,我们就称这组编码是“可立即解码的”(immediately decodable)。我们假定编码都是二进制的,一组编码中没有相同的码。每个编码长度都不超过10,每组编码数目都在2到8之间。
比如,一组二进制编码:{A, B, C, D},其中:A: 01 B: 10 C: 0010 D: 0000,这组编码是immediately decodable的;另一组编码:A: 01 B: 10 C: 010 D:0000 则不是immediately decodable的, 因为A是C的前缀。
写一个程序判断一组编码是不是immediately decodable的。
输入:由一组0和1组成的二进制码组成,以一个9表示一组编码的输入结束。
输出:格式见sample。
Sample Input
01 10 0010 0000 9 01 10 010 0000 9
Sample Output
Set 1 is immediately decodable Set 2 is not immediately decodable
本题数据类型简单,数据规模小,暴力其实就可以过。但是本题如果不用前缀树做就显得没有价值了。
Trie树,又称前缀树或字典树。Trie一词本来源于retrieval,发音[tri],但似乎更多人读为[trai]。看一下维基上的示意图应该很容易理解。
////////////////////////////////////////////////////////////////////////// // POJ3630 Phone List // Memory: 2992K Time: 157MS // Language: C++ Result: Accepted ////////////////////////////////////////////////////////////////////////// #include <cstdio> #include <iostream> using namespace std; struct Node { int child[10]; int flag; //0 非叶子节点;1 未标记的叶子节点;2 标记的叶子节点 }; Node tree[1 << 16]; int tree_pointer = 1; bool flag = true;; bool insertNode (char * s, int index) { if (tree[index].flag == 2) { return false; } if (*s == 0) { if (tree[index].flag == 1) { tree[index].flag = 2; return true; } else { return false; } } while (*s) { int d = *s - '0'; if (tree[index].child[d] == 0) { tree[index].child[d] = tree_pointer++; tree[tree_pointer - 1].flag = 1; } tree[index].flag = 0; return insertNode(s + 1, tree[index].child[d]); } } int main(void) { char buf[11]; int case_num; scanf("%d", &case_num); for (int case_no = 0; case_no < case_num; ++case_no) { int n; tree_pointer = 1; memset(tree, 0, sizeof(tree)); flag = true; scanf("%d", &n); for (int num_id = 0; num_id < n; ++num_id) { scanf("%s", buf); if (flag) { flag = insertNode(buf, 0); } } if (flag == true) { printf("YES\n"); } else { printf("NO\n"); } } }
View Code
相关文章推荐
- poj 1056 IMMEDIATE DECODABILITY & poj 3630 Phone List
- HDU 1671 & POJ 3630 Phone List
- poj3630 Phone List
- poj3630 Phone List
- Phone List --->字典树
- C++——字典树(Trie树)例题——Phone List(POJ3630)(HDU1671)
- POJ3630(Trie树) PHONE LIST 算法转载
- HDU 1671 Phone List && POJ 3630 Phone List
- POJ3630 Phone List 题解&代码
- POJ 3630 && HDU 1671 Phone list(静态字典树)
- ZOJ2876 POJ3630 HDU1671 Phone List,静态Trie树
- hdu 1671 & poj 3630 Phone List
- hdu 1672Phone List&&poj 3630Phone List
- Phone List(poj3630,简单trie树)
- poj 3630 / hdu 1671 Phone List 【Trie字典树 动态创建&静态创建】
- POJ 3630 && HDU 1671 Phone list(静态字典树)
- HDU 1671 && POJ 3630 Phone List (Trie树 好题)
- Phone List(Poj3630)
- poj3630(Phone List+字典树)
- Phone List(poj3630,字典树)