题目来源: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. C语言学习笔记--指针阅读技巧

    1. 指针阅读技巧:右左法则 (1)从最里层的圆括号中未定义的标示符看起 (2)首先往右看,再往左看 (3)遇到圆括号或方括号时可以确定部分类型,并调转方向 (4)重复 2.3 步骤,直到阅读结束 注 ...

  2. 更加省心的服务,IntentService的使用

    通过前两篇文章的学习,我们知道了服务的代码是默认运行在主线程里的,因此,如果要在服务里面执行耗时操作的代码,我们就需要开启一个子线程去处理这些代码.比如我们可以在 onStartCommand方法里面 ...

  3. Elasticsearch之curl创建索引

    前提,是 Elasticsearch之curl创建索引库 [hadoop@djt002 elasticsearch-2.4.3]$ curl -XPUT 'http://192.168.80.200: ...

  4. LaTex: 表格单元格内容 分行显示/换行

    问题:如何同时让表格同一行一个单元格的文字能垂直居中?比如说文字超长超出页面范围需要分行显示 答:(来源于smth) 方案一: \newcommand{\tabincell}[2]{\begin{ta ...

  5. javascript的概述

    JavaScript是怎么诞生的???刚开始的是为了验证表单而开发出来的. 什么是JavaScript???a.面向对象的编程语言b.解释性的编程语言(说白了就是不用编译的一种语言)c.脚本语言(说白 ...

  6. SQL基础E-R图画法

    例一.假设有以下表:T1(a1,a2, a3, a5)T2(a3,a4)T3(a5, a6)T4(a3, a5, a7)其中带下划线的属性标识为所在关系模式的主码T1中的a3是参照T2的外码T1中的a ...

  7. od命令 查看二进制文件

    od命令用于输出文件的八进制.十六进制或其它格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符. 以数值进制格式输出:od [选项] 文件 od   -d 文件       --十进制输 ...

  8. linq 初步认识

    linq to sql 类 介绍: linq如果不能用的话 重装一下vs就好了 LINQ,语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言 ...

  9. 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

    1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...

  10. 面试题:struts 拦截器和过滤器

    拦截器和过滤器的区别 过滤器是servlet规范中的一部分,任何java web工程都可以使用. 拦截器是struts2框架自己的,只有使用了struts2框架的工程才能用. 过滤器在url-patt ...