nyoj 163 Phone List(动态字典树<trie>) poj Phone List (静态字典树<trie>)
Phone List
- 描述
-
Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogue listed these numbers:
- Emergency 911
- Alice 97 625 999
- Bob 91 12 54 26
In this case, it's not possible to call Bob, because the central would direct your call to the emergency line as soon as you had dialled the first three digits of Bob's phone number. So this list would not be consistent.
- 输入
- The first line of input gives a single integer, 1 ≤ t ≤ 10, the number of test cases. Each test case starts with n, the number of phone numbers, on a separate line, 1 ≤ n ≤ 100000. Then follows n lines with one unique phone number on each line. A phone number is a sequence of at most ten digits.
- 输出
- For each test case, output "YES" if the list is consistent, or "NO" otherwise.
- 样例输入
-
2
3
911
97625999
91125426
5
113
12340
123440
12345
98346 - 样例输出
-
NO
YES/**
题目大意(nyoj 163):
判断一个字符串是否是其他字符串的前缀字符串 算法:动态(链表)字典树 步骤:
Ⅰ、用struct建立字典树的模型(并在其内部构建初始化函数)
Ⅱ、建立my_insert方法实现将数据的插入(并在插入的时候判断是否满足题意) **/基础模板代码(node、my_insert):
struct node
{
node *next[];
int cnt;
node ()
{
cnt = ;
memset (next, , sizeof (next));
}
} node *root = new node(); void my_insert (char *s)
{
node *p = new node();
int i, k, len = strlen (s);
for (i = ; i < len; ++ i)
{
k = s[i] - '';
if (p->next [k] == NULL)
p->next [k] = new node();
p = p->next [k];
}
p->cnt = ;
return ;
}nyoj 163 (AC) C\C++代码实现:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring> using namespace std; int T, n, flag, mark; char temp[]; struct node
{
node *next[];
int cnt;
node ()
{
cnt = ;
memset(next, , sizeof(next));
}
}; node *root; void my_insert (char *s)
{
node *p = root;
mark = ;
int i, k, len = strlen(s);
for (i = ; i < len; ++ i)
{
k = s[i] - '';
if (p->next[k] == NULL)
{
mark = ;
p->next[k] = new node();
}
p = p->next[k];
if (p->cnt)
{
flag = ;
return ;
}
}
if (!mark)
{
flag = ;
return ;
}
p->cnt = ;
return ;
} int main()
{
scanf("%d", &T);
while(T --)
{
flag = ;
root = new node();
scanf("%d", &n);
while(n --)
{
gets(temp);
if (!flag) continue;
my_insert (temp);
}
if (!flag)
printf("NO\n");
else
printf("YES\n");
}
return ;
}下面是poj 3630 的算法:
/**
题目大意(poj 3630):
判断一个字符串是否是其他字符串的前缀字符串
是 ==> return NO
(if all)否 ==> return YES 算法:静态字典树 步骤:
Ⅰ、用struct建立字典树模型(并在其内部构建初始化函数)
Ⅱ、建立my_insert方法实现数据的插入(并判断是否满足条件)
**/基本模型:
int pos; struct node
{
node *next[];
int cnt;
node()
{
cnt = ;
memset(next, , sizeof(next));
}
}; node *root;
pos = ; void my_insert (node *root, char *s)
{
node *p = root;
int i, k, len = strlen (s);
for (i = ; i < len; ++ i)
{
k = s[i] - '';
if (p->next [k] == )
{
p->next [k] = root + pos;
pos ++;
}
p = p->next [k];
}
p->cnt = ;
return ;
} my_insert(root + , temp);poj 3630 (C\C++代码实现 <AC>):
PS:调试用的 node root[10000]。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstring> using namespace std; int n, flag, mark, pos; char temp[]; struct node
{
node *next[];
int cnt;
node()
{
cnt = ;
memset(next, , sizeof(next));
}
}; void my_insert (node *root, char *s)
{
mark = ;
node *p = root;
int i, k ,len = strlen(s);
for (i = ; i < len; ++ i)
{
k = s[i] - '';
if (p->next[k] == )
{
mark = ;
p->next[k] = root + pos;
++ pos;
}
p = p->next[k];
if (p->cnt)
{
flag = ;
return;
}
}
if (!mark)
{
flag = ;
return ;
} p->cnt = ;
return ;
} int main () {
int N;
scanf ("%d", &N);
while (N --) {
flag = ;
node root[];
pos = ;
scanf("%d", &n);
while (n --)
{
scanf("%s", &temp[]);
if (flag) continue;
my_insert (root + , temp);
}
if (flag)
printf("NO\n");
else
printf("YES\n");
}
return ;
}
nyoj 163 Phone List(动态字典树<trie>) poj Phone List (静态字典树<trie>)的更多相关文章
- NYOJ 163 Phone List (字符串处理 字典树)
题目链接 描述 Given a list of phone numbers, determine if it is consistent in the sense that no number is ...
- poj 1056 IMMEDIATE DECODABILITY 字典树
题目链接:http://poj.org/problem?id=1056 思路: 字典树的简单应用,就是判断当前所有的单词中有木有一个是另一个的前缀,直接套用模板再在Tire定义中加一个bool类型的变 ...
- POJ 1816 - Wild Words - [字典树+DFS]
题目链接: http://poj.org/problem?id=1816 http://bailian.openjudge.cn/practice/1816?lang=en_US Time Limit ...
- WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树)
原文:WPF 资源(StaticResource 静态资源.DynamicResource 动态资源.添加二进制资源.绑定资源树) 一.WPF对象级(Window对象)资源的定义与查找 实例一: St ...
- POJ 2001 Shortest Prefixes(字典树)
题目地址:POJ 2001 考察的字典树,利用的是建树时将每个点仅仅要走过就累加.最后从根节点開始遍历,当遍历到仅仅有1次走过的时候,就说明这个地方是最短的独立前缀.然后记录下长度,输出就可以. 代码 ...
- [BinaryTree] AVL树、红黑树、B/B+树和Trie树的比较
转自:AVL树.红黑树.B/B+树和Trie树的比较 AVL树 最早的平衡二叉树之一.AVL是一种高度平衡的二叉树,所以通常的结果是,维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应 ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- poj 2001 Shortest Prefixes(字典树)
题目链接:http://poj.org/problem?id=2001 思路分析: 在Trie结点中添加数据域childNum,表示以该字符串为前缀的字符数目: 在创建结点时,路径上的所有除叶子节点以 ...
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
随机推荐
- RAW网络编程
LWIP提供了三种的可以被应用程序直接调用的接口API: (1) 低水平的,基于内核/回调函数的API(后面称 RAW API) 适用于数据量不大,没有os的MCU (2) ...
- Java8新特性 - Stream API
Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API对集合进行操作,就类似与使用SQL执行的数据库 ...
- odoo联调
odoo联调(剑飞花 373500710) 1.准备工作 1.1.参考文章“odoo8.0+PyCharm4.5开发环境配置”配置好odoo开发环境 1.2.下载Chrome浏览器,安装. 1.3.下 ...
- 在WPF中使用.NET Core 3.0依赖项注入和服务提供程序
前言 我们都知道.NET Core提供了对依赖项注入的内置支持.我们通常在ASP.NET Core中使用它(从Startup.cs文件中的ConfigureServices方法开始),但是该功能不限于 ...
- 百万年薪python之路 -- 模块二
1. 序列化模块 什么是序列化呢? 序列化的本质就是将一种数据结构(如字典.列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化. 为什么要有序列化模块? 如果你写入文件中的字符串是 ...
- vuex状态管理详细使用方法
1安装:vue ui或cnpm install vuex 2/使用import vuex from 'vuex' vue.use(vuex) var store = new Vuex.store({ ...
- SpringBoot整合Redis(一)
docker启动redis docker run -p 6379:6379 --name myredis redis 查看容器 [root@topcheer ~]# docker ps -l CONT ...
- SQLite AUTOINCREMENT
只有integer字段可以设置autoincrement.int不行.integer是无符号整型.
- linux sqlite安装
wget http://www.sqlite.org/sqlite-3.6.16.tar.gz tar -zxvf sqlite-3.6.16.tar.gz cd sqlite-3.6.16 ./c ...
- 大家都说好用的 Python 命令行库:click
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...