题目来源: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]。看一下维基上的示意图应该很容易理解。

Trie树是一种用于快速检索的多叉树结构,如上图所示的Trie树中,用11个节点保存了8个字符串(to, tea, ted, ten, A, I, in, inn). 如果两个词具有相同前缀,那么从根节点到两词对应的节点的路径在公共前缀部分是重合的。显然这种数据结构非常适合这道题的实现,用一棵二叉trie树即可。每读入一个新的编码便插入树中,如果插入过程中发现当前已存在某编码是该码的前缀或该码是已存在的某码的前缀,侧该组编码不是immediately decodable的。

 ////////////////////////////////////////////////////////////////////
// POJ1056 IMMEDIATE DECODABILITY
// Memory: 144K Time: 0MS
// Language: C++ Result : Accepted
//////////////////////////////////////////////////////////////////// #include <cstdio>
#include <iostream>
using namespace std; struct Node {
int child[];
int is_leaf;
};
Node tree[];
int tree_pointer = ;
bool flag = true;; bool insertNode (char * s, int index) {
if (tree[index].is_leaf == ) {
return false;
}
if (*s == ) {
if (tree[index].child[] == && tree[index].child[] == ) {
tree[index].is_leaf = ;
return true;
} else {
return false;
}
}
while (*s) {
int d = *s - '';
if (tree[index].child[d] == ) {
tree[index].child[d] = tree_pointer++;
}
return insertNode(s + , tree[index].child[d]);
}
} int main(void) {
char buf[];
int case_no = ;
tree[].is_leaf = ;
while (scanf("%s", buf) != EOF) {
if (buf[] == '') {
if (flag == true) {
printf("Set %d is immediately decodable\n", ++case_no);
} else {
printf("Set %d is not immediately decodable\n", ++case_no);
}
tree_pointer = ;
memset(tree, , sizeof(tree));
flag = true;
continue;
}
if (flag) {
flag = insertNode(buf, );
}
}
}

然后看一下3630.

题目大意:

  给出一些电话号码,判断是否存在一个号码是另一个号码前缀的情况, 如果不存在说明这些号码是consistent的。

输入:多个case组成,每个case第一行为号码数n, 接下来的n行每行为一个电话号码。

输出:对于每个case,若是consistent的输出YES, 否则输出NO。


Sample Input

2
3
911
97625999
91125426
5
113
12340
123440
12345
98346

Sample Output

NO
YES

两题几乎是一样的,把上题里的二叉树改为十叉树即可。

 //////////////////////////////////////////////////////////////////////////
// POJ3630 Phone List
// Memory: 2992K Time: 157MS
// Language: C++ Result: Accepted
////////////////////////////////////////////////////////////////////////// #include <cstdio>
#include <iostream>
using namespace std; struct Node {
int child[];
int flag; //0 非叶子节点;1 未标记的叶子节点;2 标记的叶子节点
};
Node tree[ << ];
int tree_pointer = ;
bool flag = true;; bool insertNode (char * s, int index) {
if (tree[index].flag == ) {
return false;
}
if (*s == ) {
if (tree[index].flag == ) {
tree[index].flag = ;
return true;
} else {
return false;
}
}
while (*s) {
int d = *s - '';
if (tree[index].child[d] == ) {
tree[index].child[d] = tree_pointer++;
tree[tree_pointer - ].flag = ;
}
tree[index].flag = ;
return insertNode(s + , tree[index].child[d]);
}
} int main(void) {
char buf[];
int case_num;
scanf("%d", &case_num);
for (int case_no = ; case_no < case_num; ++case_no) {
int n;
tree_pointer = ;
memset(tree, , sizeof(tree));
flag = true;
scanf("%d", &n);
for (int num_id = ; num_id < n; ++num_id) {
scanf("%s", buf);
if (flag) {
flag = insertNode(buf, );
}
}
if (flag == true) {
printf("YES\n");
} else {
printf("NO\n");
}
}
}

POJ1056 IMMEDIATE DECODABILITY & POJ3630 Phone List的更多相关文章

  1. POJ--1056 IMMEDIATE DECODABILITY && POJ--3630 Phone List(字典树)

    题目链接 题目大意 看输入的每个字符串中是否有一个字符串是另一个字符串的前缀 #include<iostream> #include<cstring> #include< ...

  2. POJ1056 IMMEDIATE DECODABILITY【数据结构】

    题目地址:http://poj.org/problem?id=1056 Description An encoding of a set of symbols is said to be immedi ...

  3. UVa 644 Immediate Decodability

    吐槽下我的渣渣英语啊,即使叫谷歌翻译也没有看懂,最后还是自己读了好几遍题才读懂. 题目大意:题意很简单,就是给一些互不相同的由'0','1'组成的字符串,看看有没有一个字符串是否会成为另一个的开头的子 ...

  4. hdu 1305 Immediate Decodability(字典树)

    Immediate Decodability Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  5. Immediate Decodability(字典树)

    Immediate Decodability Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  6. UVA644 Immediate Decodability

    UVA644 Immediate Decodability Trie Trie模板题 难度几乎相等的题P2580 于是他错误的点名开始了 对于每组数据都清空树太浪费时间,所以我们只要在需要新点时预先把 ...

  7. HDU 1305 Immediate Decodability 可直接解码吗?

    题意:一个码如果是另一个码的前缀,则 is not immediately decodable,不可直接解码,也就是给一串二进制数字给你,你不能对其解码,因解码出来可能有多种情况. 思路:将每个码按长 ...

  8. 「UVA644」 Immediate Decodability(Trie

    题意翻译 本题有多组数据.每组数据给出一列以"9"结尾的仅包含'0'和'1'的字符串,如果里面有一个是另一个的子串,输出"Set &case is not imm ...

  9. POJ3630/HDU-1671 Phone List,字典树静态建树!

    Phone List POJ动态建树TLE了~~~ 题意:拨打某个电话时可能会因为和其他电话号码的前几位重复而导致错误,现在给出一张电话单,求是否有某个电话是其他电话的前缀.是则输出NO,否则输出YE ...

随机推荐

  1. Shell编程进阶 1.4 shell自定义变量

    变量 系统自带变量 echo $PATH $HOME $PWD 自定义变量 # a= # echo $a1 # b= # echo $b2 写与用户交互的脚本 vim .sh #!/bin/bash ...

  2. Oracle pl/sql 显示游标和隐式游标

    显示游标 一.定义语法:        CURSOR <游标名> IS         <SELECT 语句>         [FOR UPDATE | FOR UPDATE ...

  3. 使用ffmpeg合并视频

    命令: ffmpeg -i concat:"1.avi|2.avi" -vcodec copy -acodec copy "3.avi" ffmpeg下载:ht ...

  4. jquery datatable 多行(单行)选择(select),行获取/行删除

    jquery datatable 多行(单行)选择(select),行获取/行删除 代码展示 // 示例数据源 var dataSet = [ ['Tasman','Internet Explorer ...

  5. 简单好用的General开发框架

    1.开篇概述 从2004年学习编程,2007年学习C#以来,做的多半都是跟数据库打交道的工作,所以也积累了很多数据库方面的知识,用过一些ORM框架,从了解掌握到自己实现,慢慢积累了很多代码,直到201 ...

  6. Win32编程中如何处理控制台消息

    这篇文章讨论如何处理所有的控制台消息. 第一步,首先要安装一个事件钩子,也就是说要建立一个回调函数.调用Win32 API,原型如下: BOOL SetConsoleCtrlHandler(PHAND ...

  7. ZROI2018提高day1t3

    传送门 分析 考场上想到了先枚举p的长度,在枚举这个长度的所有子串,期望得分40~50pts,但是最终只得了20pts,这是因为我写的代码在验证中总是不断删除s'中的第一个p,而这种方式不能解决形如a ...

  8. 之前在不网站看到过关于css的一些例子 今天自己也写了一个css特效

    下面是代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  9. Java50道经典习题-程序35 最大最小交换

    题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组.分析: 例如输入6 4 8 3 9 7 交换后输出9 4 8 7 6 3 import java.util.Arrays; ...

  10. 文本PDG转PDF

    作者:马健邮箱:stronghorse_mj@hotmail.com发布:2008.08.03更新:2008.08.24 补充说明:此文成文较早,当时文本PDG如果不想用官方浏览器SSREADER看, ...