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 ...
随机推荐
- C语言 · 前10名
算法提高 前10名 时间限制:1.0s 内存限制:256.0MB 问题描述 数据很多,但我们经常只取前几名,比如奥运只取前3名.现在我们有n个数据,请按从大到小的顺序,输出前10个名 ...
- WARNING: arch/arm/mach-omap2/built-in.o(.text+0x12cdc): Section mismatch in reference from the function mmc0_init() to the (unknown reference) .init.data:(unknown)
解决方法,找到对应的不能使用 __init 字眼的地方,删除他即可. 最后删除 296 static struct omap2_hsmmc_info am335x_mmc[] __initdata = ...
- maven打包源码<转>
Plugin: http://maven.apache.org/plugins/maven-source-plugin/ The Source Plugin has five goals: sourc ...
- 教你如何做一个优雅的Ecmascripter /转
看看这些被同事喷的JS代码风格你写过多少 殷荣桧 JavaScript 今天 现在写代码比以前好多了,代码的格式都有eslint,prettier,babel(写新版语法)这些来保证,然而,技术手段再 ...
- r指定位置插入一列
y<-1:4 data1 <-data.frame(x1=c(1,3,5,7), x2=c(2,4,6,8),x3=c(11,12,13,14),x4=c(15,16,17,18)) da ...
- 继电器是如何成为CPU的
阅读目录(Content) 从电池.开关和继电器开始 用继电器做个与门 用继电器做个或门 用继电器做个异或门 做一些看起来可用的东西 小小约定 振荡器 加法器 寄存器 R-S触发器 D触发器 上升沿D ...
- chrome浏览器插件推荐——Vimium 篇
Vimium 是chrome底下的一个插件,所有chrome浏览器或者是基于chrome内核的浏览器(比如我用的Vivaldi)都可以使用这个插件.它提供了大量快捷键来方便键盘党浏览网页.目前在Chr ...
- 【转】MFC 各类型相互转换
MFC下的常用字符串数据类型表示的含义: L:Long 长 P:Point 指针 C:Const 常量 W:Wchar_t 宽字符 T:TCHAR STR:String 字符串 在看看MF ...
- C++ 类的复制控制
写了又删,删了又写,才发现这一章节不好描述. 那就假定个前提吧,假定已经知道: ① C++的类有构造函数. ② 如果不提供任何构造函数,那编译器会生成默认的无参构造函数--默认构造函数只会进行成员变量 ...
- e591. Drawing Simple Text
See also e575 The Quintessential Drawing Program. public void paint(Graphics g) { // Set the desired ...