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
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
随机推荐
- JavaScript函数总结—越努力,越幸运!
JavaScript 函数总结 JavaScript为web的编程脚本语言. JavaScript由三部分组成:emc(语法) dom(文档对象模型) bom(浏览器对象模型). [函数的定义] 1. ...
- [POI2015]PIE
题目描述 一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色.你有一个a*b的印章,有些格子是凸起(会沾上墨水)的.你需要判断能否用这个印章印出纸上的图案.印的过程中需要满足以下要求:( ...
- [JZOJ5178]【NOIP2017提高组模拟6.28】So many prefix?
Description
- pytest6-Fixture finalization / executing teardown code(使用yield来实现)
Fixture finalization / executing teardown code By using a yield statement instead of return, all the ...
- 浏览器devtools系列(一)
作为一个web开发人员免不了去和浏览器打交道,前端人员更是如此. 测试人员可能在代码测试的时候容易定位,问题出现在哪里. 不过供桌中常用的可能就是几个,比如前端人员经常看控制面板调试问题,打印后台数据 ...
- Python 的多线程是鸡肋?
"唉,还没毕业就受到甲方的支配,等以后进了公司可咋整啊."小白嘴里这么吐槽,但心理上还是不敢怠慢,只能恋恋不舍地关掉眼前的游戏,打开了 Python 代码思考了起来. " ...
- SQL注入学习(二)
SQL注入点判断 ?id=35 +1/-1 查看页面是否发生变化 select * from tbName where id=$id 1.?id=35'数字后面加上[' or '' or )]来判断 ...
- markdown语法(转)
markdown语法 1.标题代码 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 2.引用代码 >你好 >> 您好 ...
- 第五篇 Flask 中内置的 Session
Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...
- 关于Map集合注意事项
今日代码中循环Map时,采用循环主键 Map<Integer,Map<Integer,String>> status = new HashMap<>(); Set ...