POJ 3630 Phone List Trie题解
Trie的应用题目。
本题有两个难点了:
1 动态建立Trie会超时,须要静态建立数组,然后构造树
2 推断的时候注意两种情况: 1) Tire树有133,然后插入13333556的时候。2)插入顺序倒转过来的时候
改动一下标准Trie数的插入函数就能够了:
#include <stdio.h>
#include <string.h> const int MAX_NODE = 100001;
const int MAX_WORD = 11;
const int ARR_SIZE = 10; struct Node
{
int n;
Node *arr[ARR_SIZE];
}; void clearNode(Node *p)
{
p->n = 0;
for (int i = 0; i < ARR_SIZE; i++)
{
p->arr[i] = NULL;
}
} Node pool[MAX_NODE];
int poolId; bool insertTrie(Node *trie, char nums[])
{
Node *pCrawl = trie;
int len = strlen(nums);
for (int i = 0; i < len; i++)
{
int j = nums[i] - '0';
//推断1: 情况: Trie有31199,插入311
if (i + 1 == len && pCrawl->arr[j]) return false;//注意这个easy遗忘条件
if (!pCrawl->arr[j])
{
pCrawl->arr[j] = &pool[poolId++];
clearNode(pCrawl->arr[j]);
}
pCrawl = pCrawl->arr[j];
if (pCrawl->n) return false;
}
for (int i = 0; i < ARR_SIZE; i++)
{//推断2: 情况: Trie有31199,插入311,和推断1是一样的,删除一个也可。 if (pCrawl->arr[i]) return false;
}
pCrawl->n++;
return true;
} int main()
{
int T, n;
scanf("%d", &T);
char word[MAX_WORD];
Node *trie = &pool[0];
while (T--)
{
clearNode(trie);
poolId = 1;
scanf("%d", &n);
getchar();
bool consistent = true;
for (int i = 0; i < n; i++)
{
gets(word);
if (consistent)
{
consistent = insertTrie(trie, word);
}
}
if (consistent) puts("YES");
else puts("NO");
}
return 0;
}
POJ 3630 Phone List Trie题解的更多相关文章
- POJ 3630 Phone List | Trie 树
题目: 给定 n 个长度不超过 10 的数字串,问其中是否存在两个数字串 S, T ,使得 S 是 T 的前缀.多组数据,数据组数不超过 40. 题解: 前缀问题一般都用Trie树解决: 所以跑一个T ...
- poj 3630 Phone List trie树
Phone List Description Given a list of phone numbers, determine if it is consistent in the sense tha ...
- poj 2431 Expedition 贪心 优先队列 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=2431 题解 朴素想法就是dfs 经过该点的时候决定是否加油 中间加了一点剪枝 如果加油次数已经比已知最少的加油次数要大或者等于了 那么就剪 ...
- poj 1064 Cable master 二分 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=1064 题解 二分即可 其实 对于输入与精度计算不是很在行 老是被卡精度 后来学习了一个函数 floor 向负无穷取整 才能ac 代码如下 ...
- POJ 3630 Phone List(trie树的简单应用)
题目链接:http://poj.org/problem?id=3630 题意:给你多个字符串,如果其中任意两个字符串满足一个是另一个的前缀,那么输出NO,否则输出YES 思路:简单的trie树应用,插 ...
- POJ 3630 trie树
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26559 Accepted: 8000 Descripti ...
- Phone List POJ 3630 Trie Tree 字典树
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29416 Accepted: 8774 Descr ...
- POJ 3630 Phone List(字符串前缀重复)题解
Description Given a list of phone numbers, determine if it is consistent in the sense that no number ...
- hdu 1671&& poj 3630 (trie 树应用)
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 25280 Accepted: 7678 Descr ...
随机推荐
- android.graphics包中的一些类的使用
游戏编程相关参考 Matrix学习系列: http://www.moandroid.com/?p=1781 Android画图学习总结系列: http://www.moandroid.com/?p=7 ...
- POJ 1330 Nearest Common Ancestors(Tarjan离线LCA)
Description A rooted tree is a well-known data structure in computer science and engineering. An exa ...
- win32 sdk 列表视图控件绘制
////////////////////////////////////////////////////////////// LRESULT ListViewCustomDraw(HWND hwnd, ...
- form表单多值提交
$.ajax({ cache: true, type: "POST", url:ajaxCallUrl, data:$('#yourformid').serialize(),// ...
- Hibernate获取Connection
package com.trendcom.base.util; import java.sql.Connection; import java.sql.SQLException; import jav ...
- ibatis新手入门
ibatis 是什么 iBATIS是以SQL为中心的持久化层框架. 能支持懒载入.关联查询.继承等特性. iBATIS不同于一般的OR映射框架. OR映射框架,将数据库表.字段等映射到类.属性,那是一 ...
- [iOS]简单的APP引导页的实现 (Swift)
在第一次打开APP或者APP更新后通常用引导页来展示产品特性 我们用NSUserDefaults类来判断程序是不是第一次启动或是否更新,在AppDelegate.swift中加入以下代码: func ...
- js弹出对话框,遮罩效果,
刚刚来到实习单位,我跟着廖哥做项目.然后他分配给我一个小小的任务,实现起来总的效果如下: 然后,但我们单击显示数目这个链接的时候,就会弹出一个又遮罩效果的对话框,如下图: 当我们在对话框中再点击里面的 ...
- 使用函数指针和多态代替冗长的if-else或者switch-case
在编程中,if-else和switch-case是很常见的分支结构,很少在程序中不用这些控制语句.但是不能否认,在一些场景下,由于分支结构过分长,导致代码不美观且不容易维护,在<重构>一书 ...
- OCP读书笔记(2) - 配置恢复
RMAN的命令类型 1. sqlplus命令 [oracle@oracle admin]$ export ORACLE_SID=orcl [oracle@oracle admin]$ rman tar ...