常规做法是枚举每个字符串每个位置,时间复杂度O(n*len*len),(建字典树O(n*len))。

然而我看这题第一眼想的是时间复杂度O(n*len)的算法。。就是建正反两棵字典树,每个字符串跑分别跑正反一遍字典树,再看看正反跑的结果能不能拼成原串。

然而常数太大了点,并没什么卵用。。

 #include<cstdio>
#include<cstring>
using namespace std;
#define MAXL 22
#define MAXN 50100 int ch0[MAXN*MAXL][],tn0,ch1[MAXN*MAXL][],tn1;
bool flag[][MAXN*MAXL];
void insert(char *s){
int x=,len=strlen(s);
for(int i=; i<len; ++i){
int y=s[i]-'a';
if(ch0[x][y]==) ch0[x][y]=++tn0;
x=ch0[x][y];
}
flag[][x]=;
x=;
for(int i=len-; i>=; --i){
int y=s[i]-'a';
if(ch1[x][y]==) ch1[x][y]=++tn1;
x=ch1[x][y];
}
flag[][x]=;
} char path[MAXL];
bool vis[][MAXL];
void query(int len){
memset(vis,,sizeof(vis));
int x=;
for(int i=; i<len; ++i){
int y=path[i]-'a';
if(ch0[x][y]==) break;
x=ch0[x][y];
if(flag[][x]) vis[][i]=;
}
x=;
for(int i=len-; i>=; --i){
int y=path[i]-'a';
if(ch1[x][y]==) break;
x=ch1[x][y];
if(flag[][x]) vis[][i]=;
}
}
void dfs(int x,int k){
if(flag[][x]){
query(k);
bool ishat=;
for(int i=; i<k; ++i){
if(vis[][i-] && vis[][i]){
ishat=;
break;
}
}
if(ishat){
for(int i=; i<k; ++i) putchar(path[i]);
putchar('\n');
}
}
for(int i=; i<; ++i){
if(ch0[x][i]){
path[k]=i+'a';
dfs(ch0[x][i],k+);
}
}
}
int main(){
char str[MAXL];
while(~scanf("%s",str)) insert(str);
dfs(,);
return ;
}

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. HDU1247 Hat’s Words 【trie树】

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

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

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

  6. hdu1247 Hat’s Words

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

  7. Trie树入门及训练

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

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

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

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

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

  10. hihocoder-1014 Trie树

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

随机推荐

  1. back(返回)键总结

    对于一般的android手机,都提供了四个(目前主流三个)按键.这几个按键中,back(返回)键用得比较多,对back键出发的事件一般是通过重写onKeyDown(int keyCode, KeyEv ...

  2. mongo数据库的导入导出

    http://www.iwangzheng.com/ [root@a02]$show dbs; changhong_tv_cms 0.078GB [root@a02]$ mongodump -d ch ...

  3. qq空间答案

    2073693795 懂得人自然会懂

  4. linux增加自定义path和manpath

    linux安装软件到自定义路径时,新安装的命令需要带上路径才可以执行,不能像系统自带命令那样可以直接使用. 这个时候可以通过修改环境变量PATH和MANPATH,来实现像系统命令一样使用新安装的命令并 ...

  5. Ubuntu14.04server开放rootssh登录权限

    刚安装了Ubuntu 14.04 server的虚拟机,普通帐号可以远程登录,但是root不行,输入密码后一直报错: permission denied 最后发现ssh的配置(/etc/ssh/ssh ...

  6. ASP.NET MVC 的URL路由介绍

    在这个教程中,向你介绍每个ASP.NET MVC一个重要的特点叫做URL路由.URL路由模块是负责映射从浏览器请求到特定的控制器动作. 在教程的第一部分,你将学习标准路由表如何映射到控制器的动作.在教 ...

  7. mysql中int、bigint、smallint 和 tinyint的区别与长度的含义

    最近使用mysql数据库的时候遇到了多种数字的类型,主要有int,bigint,smallint和tinyint.其中比较迷惑的是int和smallint的差别.今天就在网上仔细找了找,找到如下内容, ...

  8. mysql 判空

    2013年9月10日 15:44:36 update `zzb_table` set status = 1 where `link` != ''; 不要用 update `zzb_table` set ...

  9. Java for LeetCode 044 Wildcard Matching

    Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...

  10. 【python】时间性能分析

    参考: http://blog.jobbole.com/47619/ http://chenpeng.info/html/1754 1.计算整个程序运行时间,直接用linux的time命令即可 tim ...