HDU 1247 Hat’s Words 字典树(Trie树)

HDU 1247 Hat’s Words 字典树(Trie树)

字典树的建立是应该都是一样的

 

下面是我的做法:

建立完后, 对每一个单词都进行find_string()判断是否符合, 分别对其分成两半, 用j分隔开(左闭右开);

分别find()其子串[0, j+1), [j+1, string_len), 当两子串都找到后,则输出此主串, 然后,break;

一个break也让我WA, 因为如果输入为:aa aaa aaaaa, 输出是aaaaa 和 aaaaa两行.

 

find()中没有注意到判断i=j(匹配, 但不一定存在此单词), 就直接返回EXIST, 又错了....唉

结果输入aa aaa aaaaa时输出了5、6行...

应该是返回current->exist;(此单词是否存在)...

 

终于A了...^_^

2010-11-20 10:45:08    Accepted    1247    31MS    7324K    3010 B    C    Y

 

代码
#include <stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define ALPH_LEN 26
#define LEN 50000
#define WORD_LEN 100

const int ZERO = 0;
const char FIRST_CHAR = 'a';
const char EXIST = '1';
const char NON_EXIST = '0';

char word[LEN][WORD_LEN];

/* 字典树定义 */
typedef
struct node {
struct node *child[ALPH_LEN]; /* 26个元素 */
char exist; /* exist:'1' 表示存在此单词, '0'不存在 */
}node,
*Node;
Node root;
/* 字典树根结点(不存储任何元素) */

void insert(char *str)
{
int i, index, len;

Node current
= NULL, newnode = NULL; /* 当前结点和新增单词的首元素 */

len
= strlen(str);
if (ZERO == len) /* 单词长度为0, 无须插入 */
{
return;
}

current
= root; /* 每一次插入都要从根结点开始 */
for (i = 0; i < len; i++)
{
index
= str[i] - FIRST_CHAR; /* 获取此字母的下标 */
if (current->child[index] != NULL) /* 存在此字母 */
{
/* 修改当前结点 */
current
= current->child[index];
}
else
{
newnode
= (Node) calloc (1, sizeof(node));
if (NULL == newnode)
{
printf(
"空间分配失败!\n");
exit(
-1);
}

current
->child[index] = newnode; /* 插入新增结点 */
current
= newnode; /* 修改当前结点 */
}
}

current
->exist = EXIST; /* 新增单词已存在字典树中 */
}
/* 查找单词, 存在返回EXIST, 否则返回NON_EXIST */
char find(const char *str, int i, int j)
{
int index;
Node current;

if (i >= j) /* 此单词不存在 */
{
return NON_EXIST;
}

current
= root; /* 每一次遍历都要从根结点开始 */
while (i < j)
{
index
= str[i] - FIRST_CHAR;
if (current->child[index] != NULL) /* 当前字符处于字典树中 */
{
current
= current->child[index]; /* 修改当前位置 */
}
else
{
return NON_EXIST;
}

i
++;
}

return current->exist; /* 是当前单词存在与否,而不是EXIST!!! */
}
/* 查找符合的主串 */
void find_string(Node root, int len)
{
int i, j, word_len;

for (i = 0; i < len; i++) /* 每一个单词都判断一次 */
{
word_len
= strlen( word[i] ); /* 此单词长度 */
for (j = 0; j < word_len; j++)
{
if (find(word[i], 0, j + 1) == EXIST) /* 判断前辍 */
{
if (find(word[i], j + 1, word_len) == EXIST) /* 判断后辍 */
{
printf(
"%s\n", word[i]);
break;
/* 一个break也让我WA, 因为如果输入为:aa aaa aaaaa, 输出是aaaaa 和 aaaaa两行 */
}
}
}
}
}
/* 释放内存 */
void release(Node root)
{
int i;

if (NULL == root) /* 此结点为空, 不需要释放 */
{
return;
}

for (i = 0; i < ALPH_LEN; i++)
{
if (root->child[i] != NULL)
{
release(root
->child[i]);
}
}

free( root );
root
= NULL;
}

int main()
{
int i;
char string[WORD_LEN];

if ((root=(Node) calloc (1, sizeof(node))) == NULL) {
printf(
"空间分配失败!\n");
exit(
-1);
}
/* 根结点分配空间 */

i
= 0;
while (scanf("%s", string) != EOF)
{
insert(
string ); /* 插入 */
strcpy(word[i],
string);
i
++;
}

find_string(root, i);
/* 查找符合的单词 */
release( root );
/* 清理资源 */

return 0;
}

 

/*
A hat’s word is a word in the dictionary that is
the concatenation of exactly two other words in the dictionary.
You are to find all the hat’s words in a dictionary.

 

Input
Standard input consists of a number of lowercase words, one per line,
in alphabetical order. There will be no more than 50,000 words.
Only one case.

Output
Your output should contain all the hat’s words, one per line, in alphabetical order.

Sample Input
a
ahat
hat
hatword
hziee
word

Sample Output
ahat
hatword
*/

posted on 2010-11-20 10:56 PeckChen 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/xyoung/archive/2010/11/20/1882421.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++11中静态断言static_assert

c11中的静态断言(static_assert) 在c11中引入了&#xff0c;目的是在编译时就能检查处一些问题。写法如下&#xff1a; static_assert(常量表达式&#xff0c;提示字符串);如果第一个参数常量表达式的值为真(true或者非零值)&#xff0c;那么static_assert不做任何事情&#…

setBackgroundResource的一个问题

2019独角兽企业重金招聘Python工程师标准>>> 一&#xff0c;<RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android" android:id"id/layout" android:layout_width"fill_parent" android:layout_height…

驅動開發學習筆記1

1&#xff1a;設備對象是系統為幫組軟件管理硬件而創建的數據結構&#xff0c;一個物理硬件可以有多個這樣的數據結構。處於堆棧最底層的設備對象稱為物理設備對象&#xff08;PDO&#xff09;; 2&#xff1a;操作系統的pnp管理器按照設備驅動程序的要求構造了設備對象堆棧。總…

c++11之std::move()

在c11中引入了std::move()&#xff0c;目的是将左值转换为右值&#xff0c;一般与右值引用一起使用。 先说下左值与右值的区别&#xff1a; 左值&#xff1a;能被赋值的值&#xff0c;能取到地址的值。例如&#xff1a; int a 100; 右值&#xff1a;临时值&#xff0c;取不到…

Memcache应用场景

Memcache应用场景介绍面临的问题对于高并发高访问的Web应用程序来说&#xff0c;数据库存取瓶颈一直是个令人头疼的问题。特别当你的程序架构还是建立在单数据库模式&#xff0c;而一个数据池连接数峰 值已经达到500的时候&#xff0c;那你的程序运行离崩溃的边缘也不远了。很多…

21.判断栈弹出顺序是否正确

题目描述&#xff1a; 输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序&#xff0c;序列4,5,3,2,1是该压栈序列对应的一个弹出序列&#xff…

mingw + msys 上编译 ffmpeg

下载以下文件 mingw msys msysdtk ffmpeg-0.6.1 1.安装 mingw &#xff0c;一路next d:\mingw 2.安装 msys &#xff0c;msysdtk 到同样的路径下,比如:d:\msys\1.0&#xff0c;ffmpeg需要用到perl&#xff0c;刚好msysdtk中有 3.整合 msys 和 mingw 创建文件 d:\msys\1.0\…

双向长短期神经网络(Bi-LSTM)-多输入时序预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码展示&#xff1a; 四、完整代码下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编…

C++类中protected访问权限问题

在c中&#xff0c;protected修饰的成员属性和成员函数的访问权限&#xff1a; (1)、本类中的成员函数(public/private/protected修饰的函数) (2)、友元函数和友元类 (3)、派生类中的成员函数可以访问对应基类中的protected成员属性和成员函数。 #include <iostream> …

微软的云笔记:OneNote+SkyDrive

OneNote是微软的一款笔记软件&#xff08;如果单说功能要绝对要比EverNote强大多了&#xff09;&#xff0c;它可以让你随时记录各种文字、图片&#xff0c;同时在格式排版方面它也继承了Word的强大编辑功能。但是随着各种移动办公需求的产生OneNote这种本地化的保存方式确实在…

【转】温州的南拳

南拳和北腿少林武当功太极八卦连环掌中华有神功在我国传统武术中素有南拳和北腿之分&#xff0c;实际上这种分法点出了我国南北地域拳风的特点&#xff0c;南方的拳术沉马寸劲、迅疾紧凑、重拳厉掌&#xff0c;着眼在拳&#xff1b;北方的拳路却是阔幅舒展、大开大合&#xff0…

day05-数据类型与操作

转载于:https://www.cnblogs.com/klw1/p/10727073.html

mysql 8.0 一条insert语句的具体执行流程分析(一)

最近在mysql 8.0的代码上开发新的功能的时候&#xff0c;梳理了insert语句的执行过程&#xff0c;由于insert语句比较复杂并且涉及的内容很多&#xff0c;在下面准备分3章节来分析&#xff0c;这是第一个章节&#xff0c;主要讲述sql解析和命令的分发部分。 代码版本&#xff…

开发高级 Web 部件

通过用户控件实现 Web 部件相当容易&#xff0c;但是也有一些弊端&#xff1a; 受限的重用&#xff1a;如果不手动复制 .ascx 文件到其他 Web 应用程序的目录下&#xff0c;就不能动态添加这些控件到其他 Web 应用程序的页面中。 受限的个性化&#xff1a;用户控件的个性化仅限…

强一致性和弱一致性的区别

一致性包括强一致性和弱一致性&#xff1a; 弱一致性&#xff1a;可以理解为CAP定律中的不一致现象。但是经过一定的时间会达到最终一致性 强一致性: 包含线性一致性和顺序一致性。 因此强一致性不一定是线性一致性&#xff0c;但线性一致性一定是强一致性

Juqery Html(),append()等方法的Bug

标题中说是jquery中的Bug&#xff0c;只是个人这么认为&#xff0c;先申明一下&#xff01; 这几天在做动态加载图片热区&#xff0c;我用Ajax获取到了area标签&#xff0c;这里有多个area,在IE8和FF里测试正常&#xff0c;可一到IE7,和IE6里面就显示不正常了。后来发现jquery中…

Cantor定理的一种好表述

今天我在A course on Borel sets 一书中看到了Cantor定理的一种好表述.我很喜欢这种表述.在很多书中&#xff0c;康托定理是这样表述的&#xff1a; 自然数集合的所有子集形成的集合是不可数集. 也有这样表述的: $2^{\mathbb{N}}$是不可数集. 不过在A course on Borel sets 中…

分页类与前台和后台的调用方法

using System;using System.Text; namespace WebDemo.Common{ public class LaomaPager { /// <summary> /// /// </summary> /// <param name"pageSize">一页多少条</param> /// <param name"currentPage">当前页</par…

MySQL中rename一个view对应的SQL语句

OS&#xff1a;linux ubuntu 最近在对MySQL数据库开发的过程中&#xff0c;需要修改一个view的名字&#xff0c;但是找了许久才找到对应的SQL&#xff0c;切记不是alter&#xff0c;而是rename table .... 在MySQL中&#xff0c;如果想要rename 视图的名字&#xff0c;需要使用…

SharePoint2007 配置MOSS基于AD的Forms验证

公司上边要求使用Forms验证方式登陆到MOSS系统 于是经过研究测试成功了, 这次上边又要求用户必须为AD用户 查了很多资料 经过了一番周折 终于测试成功了,无奈网上文章转载的太多, 差错太多,特将本人亲自测试的具体步骤贴出来 与大家一起进步 有什么不对的地方 还希望多提出宝贵…