您的位置:首页 > 其它

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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: