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

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
 
Author
戴帽子的
 

【思路】

Trie。

对于输入字符串构造一棵Trie。枚举将字符串拆分后判断是否在Trie中存在即可。

   时间复杂度为O(n*maxl*maxl)。

指针版不用考虑maxnode的问题。

另外一定注意判断输入结束为scanf ()!=1。

【代码】

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
  6. using namespace std;
  7.  
  8. const int maxl = ;
  9. const int sigmasize = ;
  10. /*
  11. //静态分配内存版本
  12. const int maxnode = 400000;
  13. struct Trie{
  14. int ch[maxnode][sigmasize];
  15. int val[maxnode];
  16. int sz;
  17.  
  18. Trie() {
  19. sz=1;
  20. memset(ch[0],0,sizeof(ch[0]));
  21. val[0]=0;
  22. }
  23. int idx(char c) { return c-'a'; }
  24. void insert(char* s,int v) {
  25. int n=strlen(s),u=0;
  26. for(int i=0;i<n;i++) {
  27. int c=idx(s[i]);
  28. if(!ch[u][c]) {
  29. memset(ch[sz],0,sizeof(ch[sz]));
  30. val[sz]=0;
  31. ch[u][c]=sz++;
  32. }
  33. u=ch[u][c];
  34. }
  35. val[u]=v;
  36. }
  37. int find(char* s) {
  38. int n=strlen(s),u=0;
  39. for(int i=0;i<n;i++) {
  40. int c=idx(s[i]);
  41. if(!ch[u][c]) return 0;
  42. else u=ch[u][c];
  43. }
  44. return val[u];
  45. }
  46. }trie;
  47. */
  48. //动态分配内存版本
  49. struct Node{
  50. int val;
  51. Node* next[sigmasize];
  52. };
  53. struct Trie{
  54. Node *root;
  55. Trie() {
  56. root=new Node;
  57. for(int i=;i<sigmasize;i++) root->next[i]=NULL;
  58. root->val=;
  59. }
  60. int idx(char c) { return c-'a'; }
  61. void insert(char* s,int v) {
  62. int n=strlen(s);
  63. Node* u=root;
  64. for(int i=;i<n;i++) {
  65. int c=idx(s[i]);
  66. if(u->next[c]==NULL) {
  67. Node* tmp=new Node;
  68. tmp->val=;
  69. for(int i=;i<sigmasize;i++) tmp->next[i]=NULL;
  70. u->next[c]=tmp;
  71. }
  72. u=u->next[c];
  73. }
  74. u->val=v;
  75. }
  76. int find(char* s) {
  77. int n=strlen(s);
  78. Node* u=root;
  79. for(int i=;i<n;i++) {
  80. int c=idx(s[i]);
  81. if(u->next[c]==NULL) return ;
  82. else u=u->next[c];
  83. }
  84. return u->val;
  85. }
  86. void del(Node *root) {
  87. for(int i=;i<sigmasize;i++) {
  88. if(root->next[i]!=NULL) del(root->next[i]);
  89. }
  90. free(root);
  91. }
  92. }trie;
  93.  
  94. int n=;
  95. char s[][maxl];
  96.  
  97. int main() {
  98. //freopen("cin.in","r",stdin);
  99. //freopen("cout.out","w",stdout);
  100. while(scanf("%s",s[n])==) // 注意是scanf==1判断
  101. {
  102. trie.insert(s[n],);
  103. n++;
  104. }
  105. char t1[maxl],t2[maxl];
  106. FOR(i,,n-)
  107. {
  108. int len=strlen(s[i]);
  109. FOR(j,,len-) {
  110. strcpy(t1,s[i]);
  111. t1[j]='\0';
  112. strcpy(t2,s[i]+j);
  113. if(trie.find(t1) && trie.find(t2)) {
  114. printf("%s\n",s[i]);
  115. break;
  116. }
  117. }
  118. }
  119. trie.del(trie.root); //内存回收
  120. return ;
  121. }

HDU1247 Hat’s Words(Trie的动态内存版本)的更多相关文章

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

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

  2. 【转】Linux C动态内存泄漏追踪方法

    原文:http://www.cnblogs.com/san-fu-su/p/5737984.html C里面没有垃圾回收机制,有时候你申请了动态内存却忘记释放,这就尴尬了(你的程序扮演了强盗角色,有借 ...

  3. C++指针和动态内存分配

    指针和动态内存分配 数组与指针 数组 数组名是一个指针常量. 数组名传递数据时,传递的是地址. 数组作为函数参数时不指定第一维大小. 对象数组 A a[2] = {A(1,2)}; 执行时先调用有参数 ...

  4. SQLite剖析之动态内存分配

    SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性    SQLite内核和它的内存分配子系统提供以下特性 ...

  5. C和指针 第十一章 动态内存分配

    声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...

  6. 解决Ubuntu Server 12.04 在Hyper-v 2012 R2中不能使用动态内存的问题

    前言 全新Hyper-v 2012 R2终于开始支持在Linux的VPS中使用动态内存,可以大大优化服务器的资源分配,小弟我兴奋不已,于是抽空时间赶紧升级到 2012 R2,好好整理一番内存分配,不过 ...

  7. 动态内存分配导致Javascript性能的问题

    内存分配对性能的影响是很大的,分配内存本身需要时间,垃圾回收器回收内存也需要时间,所以应该尽量避免在堆里分配内存.不过直到最近优化HoLa cantk时,我才深刻的体会到内存分配对性能的影响,其中有一 ...

  8. C++动态内存管理之shared_ptr、unique_ptr

    C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存 ...

  9. 【C++】动态内存与智能指针

    C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...

随机推荐

  1. EA创建用例图步骤详解

    EA创建用例图步骤详解 1 创建一个项目 2 选择需要的模型 3 新建模型包 4 新建图表 5 新建模型包 6 创建用户角色Actor 7 新建用例 8 关联用户和用例 9 最后整个项目浏览器目录结构 ...

  2. T-SQL语言基础

    1.T-SQL语言 CREATE:创建新对象,包括数据库.表.视图.过程.触发器和函数等常见数据库对象. ALTER:修改已有对象的结构. DROP:用来删除已有的对象.有些对象是无法删除的,因为它们 ...

  3. topcoder算法练习3

    SRM144 DIV1 1100 point Problem Statement      NOTE: There are images in the examples section of this ...

  4. jQuery 源码基本框架

    抽丝剥茧, 7000+ 行的 jQuery 源码基本可以概括为以下的伪代码 (function (window, undefined) { //将 document 封装成 jQuery 对象并缓存 ...

  5. meta标签常用属性整理

    在segmentfault看到这篇文章,觉得整理的很详细,所以转载过来和大家分享一下. 原文地址:http://segmentfault.com/blog/ciaocc/119000000240791 ...

  6. Grnymotion模拟器和Android真机访问PC端Tomcat下的应用

    最近因为要学安卓与服务器交互的知识,所以必须要让android程序能访问一个测试服务器.所以我就考虑让真机或者模拟器访问PC端的Tomcat或者Apache服务. 在介绍步骤之前,有必要说点基础的.我 ...

  7. 【Linux】常用命令

    一.文件结构     /:       根目录 /bin:    系统所需要的那些命令位于此目录. /boot:   Linux的内核及引导系统程序所需要的文件目录,GRUB或LILO系统引导管理器也 ...

  8. PHP 开启 ssh2

    首先,为PHP安装SSH2扩展需要两个软件包, libssh2和ssh2(php pecl拓展). 两者的最新版本分别为libssh2-1.5.0.tar.gz和ssh2-0.12.tgz,下载地址分 ...

  9. python中文字符串前加u

    我明明在编码前就加上了# -*- coding: UTF-8 -*-可是运行时还是出错了, # -*- coding: UTF-8 -*- 这句是告诉python程序中的文本是utf-8编码,让pyt ...

  10. BZOJ 1070 修车

    Description 同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心.维修中心共有\(M\)位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这\(M\)位技术 ...