HDU 1247 Hat’s Words(字典树)

本文介绍了一种使用字典树解决Hat'sWords问题的方法。通过构建字典树并枚举子单词的方式,判断一个单词是否能由字典中的其他两个单词组成。此方法在大量单词输入的情况下仍能保持高效。

 

题目大意

 

字典中,一个单词是一个 hat's word:这个单词可以由字典中另外两个单词拼接而成

给你一个字典,求出字典中所有的 hat's word

单词最多有 50000 个

 

做法分析

 

看到这道题,感觉无从下手,单词的数量这么多,但是仔细一想,单词数是多了,但是如果每个单词的平均长度必然就小了,不然光是读入数据就得超时

于是,先乱搞一发再说

 

建立一棵字典树,然后,对于每个单词,直接暴力,竟然神奇的过了!

暴力的做法是:枚举第一个子单词的长度,剩下的为第二个子单词,分别在字典树中匹配,看能否找到一个单词与两个单词匹配,能的话,这是一个 hat's word

 

参考代码

 

HDU 1247
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 struct Tire
 9 {
10     struct Node
11     {
12         Node *next[26];
13         bool flag;
14         Node()
15         {
16             for(int i=0; i<26; i++) next[i]=NULL;
17             flag=0;
18         }
19     };
20     Node *root;
21     Tire()
22     {
23         root=new Node();
24     }
25 
26     void Insert(char s[])
27     {
28         Node *u=root;
29         for(int i=0; s[i]; i++)
30         {
31             int v=s[i]-'a';
32             if(u->next[v]==NULL) u->next[v]=new Node();
33             u=u->next[v];
34         }
35         u->flag=1;
36     }
37 
38     bool Find(char buff[], int s, int t)
39     {
40         Node *u=root;
41         for(int i=s; i<=t; i++)
42         {
43             int v=buff[i]-'a';
44             if(u->next[v]==NULL) return false;
45             u=u->next[v];
46         }
47         return u->flag;
48     }
49 } tree;
50 
51 char s[50005][100];
52 int tot;
53 
54 int main()
55 {
56     for(tot=0; scanf("%s", s[tot])!=EOF; tot++)
57         tree.Insert(s[tot]);
58     for(int i=0; i<tot; i++)
59     {
60         int t=(int)strlen(s[i])-1;
61         for(int j=0; j<t; j++)
62             if(tree.Find(s[i], 0, j) && tree.Find(s[i], j+1, t))
63             {
64                 printf("%s\n", s[i]);
65                 break;
66             }
67     }
68     return 0;
69 }

 

 

AC通道

 

HDU 1247 Hat’s Words

 

 

 

转载于:https://www.cnblogs.com/zhj5chengfeng/archive/2013/04/15/3021584.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值