POJ1056 IMMEDIATE DECODABILITY & POJ3630 Phone List
题目来源: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的更多相关文章
- POJ--1056 IMMEDIATE DECODABILITY && POJ--3630 Phone List(字典树)
题目链接 题目大意 看输入的每个字符串中是否有一个字符串是另一个字符串的前缀 #include<iostream> #include<cstring> #include< ...
- POJ1056 IMMEDIATE DECODABILITY【数据结构】
题目地址:http://poj.org/problem?id=1056 Description An encoding of a set of symbols is said to be immedi ...
- UVa 644 Immediate Decodability
吐槽下我的渣渣英语啊,即使叫谷歌翻译也没有看懂,最后还是自己读了好几遍题才读懂. 题目大意:题意很简单,就是给一些互不相同的由'0','1'组成的字符串,看看有没有一个字符串是否会成为另一个的开头的子 ...
- hdu 1305 Immediate Decodability(字典树)
Immediate Decodability Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- Immediate Decodability(字典树)
Immediate Decodability Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- UVA644 Immediate Decodability
UVA644 Immediate Decodability Trie Trie模板题 难度几乎相等的题P2580 于是他错误的点名开始了 对于每组数据都清空树太浪费时间,所以我们只要在需要新点时预先把 ...
- HDU 1305 Immediate Decodability 可直接解码吗?
题意:一个码如果是另一个码的前缀,则 is not immediately decodable,不可直接解码,也就是给一串二进制数字给你,你不能对其解码,因解码出来可能有多种情况. 思路:将每个码按长 ...
- 「UVA644」 Immediate Decodability(Trie
题意翻译 本题有多组数据.每组数据给出一列以"9"结尾的仅包含'0'和'1'的字符串,如果里面有一个是另一个的子串,输出"Set &case is not imm ...
- POJ3630/HDU-1671 Phone List,字典树静态建树!
Phone List POJ动态建树TLE了~~~ 题意:拨打某个电话时可能会因为和其他电话号码的前几位重复而导致错误,现在给出一张电话单,求是否有某个电话是其他电话的前缀.是则输出NO,否则输出YE ...
随机推荐
- 问题:C#控制台;结果:C#限制程序只能运行一個实例 (防多开)
C# Console类的具体用法 作者: 字体:[增加 减小] 类型:转载 时间:2013-03-08 这篇文章主要介绍C# Console类的具体用法,需要的朋友可以参考下 Console.Wr ...
- [mpm_winnt:error] [pid 28120:tid 15980] (OS 10038)在一个非套接字上尝试了一个操作。 : AH00332: winnt_accept: getsockname error on listening socket, is IPv6 available?
解决办法一: 可能是安装了某些程序修改了Winsock,使用netsh winsock reset 命令修复Winsock重启计算机即可! 解决办法二: 在httpd.conf文件中添加 Win32D ...
- Sandbox简介和路径获取
一.简介 iOS的沙盒机制,每个应用只能访问自己应用目录下的文件.iOS应用产生的内容,如文件.缓存内容等都必须存储在自己的沙盒内.默认情况下,每个沙盒含有3个文件夹:Documents, Libra ...
- Javascript面向对象(二):构造函数的继承
这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个" ...
- Android LRUCache
package android.util; import java.util.LinkedHashMap; import java.util.Map; /** * A cache that holds ...
- spring配置c3p0连接池
- render tree与css解析
浏览器在构造DOM树的同时也在构造着另一棵树-Render Tree,与DOM树相对应暂且叫它Render树吧,我们知道DOM树为javascript提供了一些列的访问接口(DOM API),但这棵树 ...
- Android中无标题样式和全屏样式学习
在进行UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置. 1.在xml文件中进行配置 在项目的清单文件AndroidManife ...
- Angular07 利用angular打造管理系统页面
1 创建一个新的angular应用 ng new adminSystem 2 利用WebStorm打开adminSystem应用 3 借助AdminLTE这个开源项目来辅助开发 AdminLTE项目: ...
- Emgu cv3.0.0 图像收集
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...