Hat’s Words

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 7502    Accepted Submission(s): 2705
Problem Description
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

这题開始总想着走捷径,想依据trie树内部节点将单词分成前后缀,前缀一定在树里,所以仅仅需推断后缀是否在树里,可是非常多细节非常棘手,比方如何确定后缀。后缀如何检索。如何在一个单词内改变前后缀等,折腾了非常久,实在没法解决,然后就用了一開始就非常鄙夷的方法,将每一个字符串都存到数组并插入到树里。然后将每一个字符串遍历拆分成前后缀,再检索前后缀是否都在树中。

这题再次验证了一个道理,就是在没有想出更好的方法之前。最笨的方法就是最好的方法。

#include <stdio.h>
#include <string.h>
#include <stdlib.h> struct Node{
struct Node *next[26];
int wordCover;
};
Node *root = (Node *)malloc(sizeof(Node));
char suffix[50], prefix[50], strArr[50000][50]; void cleanStruct(Node *p)
{
memset(p->next, 0, sizeof(p->next));
p->wordCover = 0;
} void insert(char *str)
{
int id;
Node *p = root;
while(*str)
{
id = *str - 'a';
if(p->next[id] == NULL){
p->next[id] = (Node *)malloc(sizeof(Node));
cleanStruct(p->next[id]);
}
p = p->next[id];
++str;
}
++p->wordCover;
} int isExist(char *str)
{
Node *p = root;
int id;
while(*str){
id = *str - 'a';
if(p->next[id] == NULL) return 0;
p = p->next[id];
++str;
}
return p->wordCover;
} void deleteTrie(Node *p)
{
for(int i = 0; i < 26; ++i)
if(p->next[i]) deleteTrie(p->next[i]);
free(p);
} int main()
{
//freopen("stdin.txt", "r", stdin);
int id = 0, i, j, len;
cleanStruct(root);
while(gets(strArr[id])) insert(strArr[id++]);
for(i = 0; i < id; ++i){
len = strlen(strArr[i]);
for(j = 1; j < len; ++j){
strcpy(prefix, strArr[i]);
prefix[j] = '\0';
strcpy(suffix, strArr[i] + j);
if(isExist(prefix) && isExist(suffix)){
puts(strArr[i]); break;
}
}
}
deleteTrie(root);
return 0;
}

2014.12.16更新

#include <stdio.h>
#include <string.h> #define maxn 1000000 char str[50], str1[50], str2[50], dic[50002][50];
struct Trie {
int ch[maxn][26];
int val[maxn], sz; Trie() {
memset(ch[0], 0, sizeof(ch[0]));
sz = 1;
}
int idx(char ch) { return ch - 'a'; };
void insert(const char *str) {
int u = 0, i, id, len = strlen(str);
for (i = 0; i < len; ++i) {
id = idx(str[i]);
if (!ch[u][id]) {
memset(ch[sz], 0, sizeof(ch[sz]));
ch[u][id] = sz;
val[sz++] = 0;
}
u = ch[u][id];
}
val[u] = 1;
}
bool find(const char *str) {
int u = 0, i, id, len = strlen(str);
for (i = 0; i < len; ++i) {
id = idx(str[i]);
if(!ch[u][id]) return false;
u = ch[u][id];
}
return val[u];
}
} T; int main() {
// freopen("stdin.txt", "r", stdin);
int id = 0, i, j, len;
while (scanf("%s", str) == 1) {
T.insert(str);
strcpy(dic[id++], str);
}
for (i = 0; i < id; ++i) {
len = strlen(dic[i]);
for (j = 1; j < len; ++j) {
strncpy(str1, dic[i], j);
strncpy(str2, dic[i] + j, len - j);
str1[j] = '\0';
str2[len-j] = '\0';
if (T.find(str1) && T.find(str2)) {
puts(dic[i]); break;
}
}
}
return 0;
}

HDU1247 Hat’s Words 【trie树】的更多相关文章

  1. HDU1247 - Hat’s Words(Trie树)

    题目大意 给定一些单词,要求你把所有的帽子单词找出来,如果某个单词恰好由另外两个单词连接而成,那么它就是帽子单词 题解 先把所有单词插入到Trie树,然后判断每个单词是不是帽子单词,做法就是:对于第i ...

  2. Hdu 1247 Hat's Words(Trie树)

    Hat's Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...

  3. hdu-1247 Hat’s Words---字典树模板

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1247 题目大意: 给出一些单词,以EOF结束,看其中哪一个单词可以由其他两个单词组成,将其输出 解题 ...

  4. DHU--1247 Hat’s Words && HiHocder--1014 Trie树 (字典树模版题)

    题目链接 DHU--1247 Hat’s Words HiHocder--1014 Trie树 两个一个递归方式一个非递归 HiHocoder #include<bits/stdc++.h> ...

  5. hdu1247 Hat’s Words

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=1247 题目: Hat's Words Time Limit: 2000/1000 MS (Ja ...

  6. Trie树入门及训练

    什么叫Trie树? Trie树即字典树. 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本 ...

  7. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  8. 基于trie树的具有联想功能的文本编辑器

    之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...

  9. hihocoder-1014 Trie树

    hihocoder 1014 : Trie树 link: https://hihocoder.com/problemset/problem/1014 题意: 实现Trie树,实现对单词的快速统计. # ...

随机推荐

  1. (转)织梦DedeCMSv5.7安装体验数据包的方法

    1.先安装一个全新的DedeCMS v5.7 GBK系统,这里以DedeCMS v5.7 GBK系统为例. 2.下载数据体验包: 如果是gbk则下载:http://www.dedecms.com/de ...

  2. [转]delphi 删除动态数组的指定元素

    type TArr = array of TPoint; {把数组先定义成一个类型会方便许多, 这里仅用 TPoint 测试} {删除动态数组指定元素的过程: 参数 arr 是数组名, 参数 Inde ...

  3. WebService CXF调试常见报错及解决方案

    1.CXF java.lang.RuntimeException: Cannot create a secure XMLInputFactory 解决方案:从apache-cxf/lib下寻找Wood ...

  4. AutoIt3初探(1)

    AutoIt3可实现系统操作,键盘鼠标模拟,是自动化测试的一个好工具. 这个是在线帮助文档,http://www.jb51.net/shouce/autoit/ 需要先下载一个autoIt安装,然后将 ...

  5. connect函数

    TCP客户用connect函数来建立与TCP服务器的连接 int connect (int sockfd, const sockaddr * servaddr, socklen_t addrlen); ...

  6. Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建

    Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建 由于公司里的Solr调试都是用远程jpda进行的,但是家里只有一台电脑所以不能jpda进行调试,这是因为jpda的端口冲突.所以 ...

  7. QT美化界面的文章(真的很美)

    http://www.hookr.cn/tag/qt http://blog.csdn.net/yiyaaixuexi/article/category/758470 http://www.qtcn. ...

  8. redis-cli批量删除时的坑

    redis-cli keys "*"|xargs redis-cli del tips: keys后面的*号,必须要加双引号,不然删不掉 # redis-cli keys *|xa ...

  9. 【HDOJ】1107 武林

    简单模拟,题目数据太弱太弱了. /* 1107 */ #include <iostream> #include <cstdio> #include <cstring> ...

  10. 设计模式(二): BUILDER生成器模式 -- 创建型模式

    1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...