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. oracle问题 《经由直接路径由 EXPORT:V10.02.01 创建的导出文件 IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件》

    问题:  经由直接路径由 EXPORT:V10.02.01 创建的导出文件 : 只有 DBA 才能导入由其他 DBA 导出的文件 解决方法:用sys 登录,给当前用户授权,授权语句:grant dba ...

  2. jquery动画总结

    基本动画 show() //直接显示元素,没有动画 show(speed, [callback]) //有动画,有回调函数 hide() //直接隐藏元素,没有动画 hide(speed, [call ...

  3. JavaScript 之 关键内容

    词法作用域.调用对象.作用域链.闭包.构造函数.原型.类.继承 局部变量查找路径 属性查找路径

  4. poj3278 BFS入门

    M - 搜索 Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:65536KB     64bit I ...

  5. 你好,C++(32) 类是对现实世界的抽象和描述 6.2.1 类的声明和定义

    6.2  类:当C++爱上面向对象 类这个概念是面向对象思想在C++中的具体体现:它既是封装的结果,同时也是继承和多态的载体.因此,要想学习C++中的面向对象程序设计,也就必须从“类”开始. 6.2. ...

  6. 【USACO 2.1.4】荷斯坦奶牛

    [题目描述] 纪念“逝去”的Wecing 农民JOHN以拥有世界上最健康的奶牛为傲.他知道每种饲料中所包含的牛所需的最低的维他命量是多少.请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数 ...

  7. 【USACO 1.1.1】你的飞碟在这儿

    [问题描述] 一个众所周知的事实,在每一慧星后面是一个不明飞行物UFO. 这些不明飞行物时常来收集来自在地球上忠诚的支持者. 不幸地,他们的空间在每次旅行只能带上一群支持者. 他们要做的是用一种聪明的 ...

  8. ubuntu忘记登录账户以及密码

    笔者在诸多方面仍然是初学者.感兴趣的方面也很多,电脑装上ubuntu14.04也有一段时间了,但仍然在不断学习更多基础的东西. 因为对于命令行界面还有些不习惯,所以一直依赖于图形界面,需要使用终端的时 ...

  9. 转发:[Python]内存管理

    本文为转发,原地址为:http://chenrudan.github.io/blog/2016/04/23/pythonmemorycontrol.html 本文主要为了解释清楚python的内存管理 ...

  10. 写给新手看的Flask+uwsgi+Nginx+Ubuntu部署教程

    学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...