HDU1247 Hat’s Words(Trie的动态内存版本)
Hat’s Words
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11447 Accepted Submission(s): 4085
You are to find all the hat’s words in a dictionary.
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.
ahat
hat
hatword
hziee
word
hatword
【思路】
Trie。
对于输入字符串构造一棵Trie。枚举将字符串拆分后判断是否在Trie中存在即可。
时间复杂度为O(n*maxl*maxl)。
指针版不用考虑maxnode的问题。
另外一定注意判断输入结束为scanf ()!=1。
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; const int maxl = ;
const int sigmasize = ;
/*
//静态分配内存版本
const int maxnode = 400000;
struct Trie{
int ch[maxnode][sigmasize];
int val[maxnode];
int sz; Trie() {
sz=1;
memset(ch[0],0,sizeof(ch[0]));
val[0]=0;
}
int idx(char c) { return c-'a'; }
void insert(char* s,int v) {
int n=strlen(s),u=0;
for(int i=0;i<n;i++) {
int c=idx(s[i]);
if(!ch[u][c]) {
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}
int find(char* s) {
int n=strlen(s),u=0;
for(int i=0;i<n;i++) {
int c=idx(s[i]);
if(!ch[u][c]) return 0;
else u=ch[u][c];
}
return val[u];
}
}trie;
*/
//动态分配内存版本
struct Node{
int val;
Node* next[sigmasize];
};
struct Trie{
Node *root;
Trie() {
root=new Node;
for(int i=;i<sigmasize;i++) root->next[i]=NULL;
root->val=;
}
int idx(char c) { return c-'a'; }
void insert(char* s,int v) {
int n=strlen(s);
Node* u=root;
for(int i=;i<n;i++) {
int c=idx(s[i]);
if(u->next[c]==NULL) {
Node* tmp=new Node;
tmp->val=;
for(int i=;i<sigmasize;i++) tmp->next[i]=NULL;
u->next[c]=tmp;
}
u=u->next[c];
}
u->val=v;
}
int find(char* s) {
int n=strlen(s);
Node* u=root;
for(int i=;i<n;i++) {
int c=idx(s[i]);
if(u->next[c]==NULL) return ;
else u=u->next[c];
}
return u->val;
}
void del(Node *root) {
for(int i=;i<sigmasize;i++) {
if(root->next[i]!=NULL) del(root->next[i]);
}
free(root);
}
}trie; int n=;
char s[][maxl]; int main() {
//freopen("cin.in","r",stdin);
//freopen("cout.out","w",stdout);
while(scanf("%s",s[n])==) // 注意是scanf==1判断
{
trie.insert(s[n],);
n++;
}
char t1[maxl],t2[maxl];
FOR(i,,n-)
{
int len=strlen(s[i]);
FOR(j,,len-) {
strcpy(t1,s[i]);
t1[j]='\0';
strcpy(t2,s[i]+j);
if(trie.find(t1) && trie.find(t2)) {
printf("%s\n",s[i]);
break;
}
}
}
trie.del(trie.root); //内存回收
return ;
}
HDU1247 Hat’s Words(Trie的动态内存版本)的更多相关文章
- HDU1247 - Hat’s Words(Trie树)
题目大意 给定一些单词,要求你把所有的帽子单词找出来,如果某个单词恰好由另外两个单词连接而成,那么它就是帽子单词 题解 先把所有单词插入到Trie树,然后判断每个单词是不是帽子单词,做法就是:对于第i ...
- 【转】Linux C动态内存泄漏追踪方法
原文:http://www.cnblogs.com/san-fu-su/p/5737984.html C里面没有垃圾回收机制,有时候你申请了动态内存却忘记释放,这就尴尬了(你的程序扮演了强盗角色,有借 ...
- C++指针和动态内存分配
指针和动态内存分配 数组与指针 数组 数组名是一个指针常量. 数组名传递数据时,传递的是地址. 数组作为函数参数时不指定第一维大小. 对象数组 A a[2] = {A(1,2)}; 执行时先调用有参数 ...
- SQLite剖析之动态内存分配
SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性 SQLite内核和它的内存分配子系统提供以下特性 ...
- C和指针 第十一章 动态内存分配
声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...
- 解决Ubuntu Server 12.04 在Hyper-v 2012 R2中不能使用动态内存的问题
前言 全新Hyper-v 2012 R2终于开始支持在Linux的VPS中使用动态内存,可以大大优化服务器的资源分配,小弟我兴奋不已,于是抽空时间赶紧升级到 2012 R2,好好整理一番内存分配,不过 ...
- 动态内存分配导致Javascript性能的问题
内存分配对性能的影响是很大的,分配内存本身需要时间,垃圾回收器回收内存也需要时间,所以应该尽量避免在堆里分配内存.不过直到最近优化HoLa cantk时,我才深刻的体会到内存分配对性能的影响,其中有一 ...
- C++动态内存管理之shared_ptr、unique_ptr
C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存 ...
- 【C++】动态内存与智能指针
C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...
随机推荐
- C#生成验证码实例
常用生成验证码实例封装: /// <summary> /// 生成内存位图 /// </summary> /// <param name="Code" ...
- jquery生成UUID的方法
来源: http://www.broofa.com/2008/09/javascript-uuid-function/ 1.代码: http://www.broofa.com/Tools/Math ...
- VSS Admin 清除密码
[参阅链接]http://www.cnblogs.com/Zealot/archive/2004/09/18/44309.html the secret is to hack the um.dat f ...
- 那些常用的eclipse快捷键
用了很久的eclipse了,有些快捷键常用,有的偶尔使用,现在记下常用的快捷键,以便大家和自己查用(持续更新) 这些快捷键都可以在[window]-[preferences]-[general]-[k ...
- DataSet与DataTable基本用法
http://files.cnblogs.com/files/monkeyZhong/DataSetExample.rar 在设计数据库操作或者XML操作等表格数据时,我们难免要跟DataSet和Da ...
- HTML5 表单与文件
-新增元素与属性 form.formaction.formmethod.placeholder(处于未输入状态时文本框显示的输入提示).autofocus(自动获取光标焦点).list(该属性的值为某 ...
- js+css3 动画数字累加
css: .kk{ width:100px; height:100px; display:inline-block; color:red; text-align:center; position: r ...
- Delphi中停靠技术的实现
随着软件技术的不断进步,软件界面也越来越美观,操作也越来越方便.综观市面上比较专业的各种软件,我们会发现大部分都提供窗体停靠的功能,特别象工具软件,基本上都或多或少有停靠功能.自然,Delphi也支持 ...
- 练习2 A - ASCII码排序
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 输入三 ...
- Flex DataGrid 添加控件
哈喽,又和大家见面了.今天要写的东西是关于Flex DataGrid添加“编辑”或“删除”按钮. 下面是部分代码: <mx:DataGrid id="dgShow" x=&q ...