poj_3630 trie树
题目大意
给定一系列电话号码,查看他们之间是否有i,j满足,号码i是号码j的前缀子串。
题目分析
典型的trie树结构。直接使用trie树即可。但是需要注意,若使用指针形式的trie树,则在大数据量下new/delete会很耗时,因此使用静态数组来存储trie树结构。使用静态数组代替指针在oj中常用于节省时间!
实现(c++)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#define MAX_CHILD_NUM 10
#define MAX_NODE_NUM 1 << 16
struct TrieNode{
int count;
int childs[MAX_CHILD_NUM];
TrieNode(){
count = 0;
memset(childs, 0, sizeof(childs));
}
}; TrieNode gNodes[MAX_NODE_NUM]; //静态数组方式存储
int gCount;
bool Insert(int root, char* str){
int node = root;
char* p = str;
while (*p != '\0'){
int index = *p - '0';
if (gNodes[node].childs[index] == 0){
gNodes[node].childs[index] = gCount++;
}
node = gNodes[node].childs[index];
if (gNodes[node].count == 2){ //若为某个号码的结尾,则说明出现了前缀子串。
return false;
}
if (*(p + 1) == '\0'&&gNodes[node].count == 1){ //特殊情况,画图分析很容易看出
return false;
}
gNodes[node].count = 1; //为1 表示该节点是某个号码内部的点
p++;
}
if (gNodes[node].count == 2){ //为2说明该点是某个号码结尾的点
return false;
}
gNodes[node].count = 2;
return true;
} int main(){
int cas;
char number[20];
scanf("%d", &cas);
for (int i = 0; i < cas; i++){
memset(gNodes, 0, sizeof(gNodes));
gCount = 2; int n;
scanf("%d", &n);
getchar();
bool flag = true;
for (int k = 0; k < n; k++){
scanf("%s", number);
if (flag)
flag = Insert(1, number);
}
if (!flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
poj_3630 trie树的更多相关文章
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- 基于trie树的具有联想功能的文本编辑器
之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...
- hihocoder-1014 Trie树
hihocoder 1014 : Trie树 link: https://hihocoder.com/problemset/problem/1014 题意: 实现Trie树,实现对单词的快速统计. # ...
- 洛谷P2412 查单词 [trie树 RMQ]
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...
- 通过trie树实现单词自动补全
/** * 实现单词补全功能 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #incl ...
- #1014 Trie树
本题主要是求构造一棵Trie树,即词典树用于统计单词. C#代码如下: using System; using System.Collections.Generic; using System.Lin ...
- Trie树-字典查找
描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...
- Trie树的创建、插入、查询的实现
原文:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28977986&id=3807947 1.什么是Trie树 Tr ...
- Trie树(c++实现)
转:http://www.cnblogs.com/kaituorensheng/p/3602155.html http://blog.csdn.net/insistgogo/article/detai ...
随机推荐
- acrobat-网格-参考线-网格大小设置
视图--显示/隐藏--标尺及网格-网格/标尺: 网格:ctrl+U 标尺:ctrl+R 标尺: 网格: 标尺+网格: 网格大小设置: 编辑--首选项-单位和参考线 2013 ...
- 【Unity】使用Git管理项目及其.gitignore写法
完整的进行Unity 3D源码用Git管理的流程: 1 新建文件夹(路径要求非空) 2 新建U3D项目 3 添加.gitignore文件 获取已有的U3D项目 修改Unity 3D编辑器: Enabl ...
- MyEclipse SVN 下面切换用户的解决方案
configuration\org.eclipse.core.runtime\.keyring 删除MyEclipse下面的文件. 或者修改服务器端的用户密码.
- linux挂载根文件系统过程
linux-2.6.36内核 start arch/arm/boot/compressed/head.S arch/arm/kernel/head.S start_kernel() ...
- Cocos2d-x 3.0final 终结者系列教程06-Director和场景跳转
这些天互联网大事不少呀 1.逻辑思维分家(所谓合久必分,分久必合,实属正常.切行切珍惜吧) 2. 锤子手机开卖 (无论你买没买,反正我没买,作为多年Android开发的我深知说的亮点事实上在我看来都 ...
- Mac中Java 配置maven及阿里云镜像
一:配置maven 1.下载maven,选择Binary tar.gz,解压拷贝到目录/usr/local/ 1 https://maven.apache.org/download.cgi 2.配置系 ...
- web.xml配置文件元素详解
一.web.xml配置文件常用元素及其意义 1 <web-app> 2 3 <!--定义了WEB应用的名字--> 4 <display-name></disp ...
- android 编译 app
有些编写的app需要放到android的源码中进行编译.放置的路径packages/apps/ 编译方法,参考 http://blog.csdn.net/luoshengyang/article/de ...
- spring只是一个框架
想跟着 spring in action 4 系统的研究下spring,结果发现忘了怎么建一个spring项目. 关键是,不知道该建一个什么项目,Java项目?Maven项目(Java项目?Web项目 ...
- UI标签库专题十一:JEECG智能开发平台 DictSelect (数据字典下拉选择框)
1. DictSelect (数据字典下拉选择框) 1.1. 參数 属性名 类型 描写叙述 是否必须 默认值 typeGroupCode string 字典分组编码 是 null field s ...