hdu 1247

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

题解:刚开始就老想着在  find函数里修改,其实  模板不用变,就是多了对字符串的处理。

代码:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <math.h>
  4 #include <algorithm>
  5 #include <iostream>
  6 #include <ctype.h>
  7 #include <iomanip>
  8 #include <queue>
  9 #include <stdlib.h>
 10 using namespace std;
 11
 12 struct Tri
 13 {
 14     bool v;
 15     Tri* child[26];
 16 };
 17
 18 Tri* root;
 19
 20 void Init()
 21 {
 22     root->v=false;
 23     for(int i=0;i<26;i++)
 24     {
 25         root->child[i]=NULL;
 26     }
 27 }
 28
 29 void CreateDic(char* s)
 30 {
 31     Tri* p;
 32     int j;
 33     int len=strlen(s);
 34     if(len==0)
 35         return ;
 36     p=root;
 37     for(int i=0 ;i < len; i++)
 38     {
 39         if(p->child[s[i]-‘a‘]==NULL)
 40         {
 41             p->child[s[i]-‘a‘]=(Tri*)new Tri;
 42             p->child[s[i]-‘a‘]->v=false;
 43             for(j=0;j<26;j++)
 44                 p->child[s[i]-‘a‘]->child[j]=NULL;
 45         }
 46         p=p->child[s[i]-‘a‘];
 47
 48     }
 49     p->v=true;
 50 }
 51
 52 bool Find(char *s)
 53 {
 54     Tri* p=root;
 55     int len=strlen(s);
 56     if(len==0)
 57         return 0;
 58     for(int i=0 ;i < len; i++)
 59     {
 60         if(p->child[s[i]-‘a‘]==NULL)
 61             return 0;
 62         p=p->child[s[i]-‘a‘];
 63     }
 64     return p->v;
 65 }
 66
 67 void Del(Tri* p)
 68 {
 69     for(int i=0;i<26;i++)
 70         if(p->child[i])
 71             Del(p->child[i]);
 72     Del(p);
 73
 74 }
 75
 76 char total[50002][100];
 77 int main()
 78 {
 79     char a[100],b[100],c[100];
 80     int i=0,j,k;
 81
 82     root=(Tri*)new Tri;
 83     Init();
 84     while(gets(a))
 85     {
 86         CreateDic(a);
 87         strcpy(total[i++],a);
 88     }
 89
 90     for(j=0;j<i;j++)
 91     {
 92         for(k=1;k<strlen(total[j]);k++)
 93         {
 94             strncpy(b,total[j],k);
 95             b[k]=‘\0‘;
 96             strcpy(c,total[j]+k);
 97
 98             if(Find(b)&&Find(c))
 99             {
100                 cout<<total[j]<<endl;
101                 break;   //注意结束循环
102             }
103         }
104     }
105     return 0;
106 }
时间: 2024-10-24 15:37:58

hdu 1247的相关文章

HDU 1247 Hat&#39;s Words (字典树)

[题目链接]click here~~ [题目大意]A hat's word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary. ,找出由两个子字符串组成的字符串. [解题思路]字典树 #include <bits/stdc++.h> using namespace std; const int N=5*1e4+100; const int MOD=

hdu 1247 Hat’s Words 字典树

// hdu 1247 Hat's Words 字典树 // // 题目大意: // // 在一些字符串中,找到这样字符串:由两个其他的字符串构成 // // 解题思路: // // 字典树,先将这些字符串插入到字典树中,然后枚举断点,如果 // 字符串的前后两段都找到了,输出该串即可~ // // 感悟: // // 这道题目的话,就是字典树上的暴力嘛,细节方面还是要多多注意 // val值还是不能少哟~因为查找到了该串,不一定是一个单词,可能 // 是中间的一个节点,即某个字符串的前缀~~~

hdu 1247 map的使用

http://acm.hdu.edu.cn/showproblem.php?pid=1247 Hat’s Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7760    Accepted Submission(s): 2814 Problem Description A hat’s word is a word in the

hdu 1247:Hat’s Words(字典树,经典题)

Hat's Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7282    Accepted Submission(s): 2639 Problem Description A hat's word is a word in the dictionary that is the concatenation of exactly

HDU 1247 Hat’s Words Trie题解

使用Trie的insert函数,主要是要灵活修改search函数,使得其可以快速搜索hat word. 思路: 1 先搜索一个word的前缀有没有在Trie树中找到,如果找到,保存这个Node,方便下面继续搜索, 就搜索余下的能不能是Trie树上的一个单词,如果找到,那么就是hat word了. 2 如果没找到,那么就沿着刚刚搜索到的前缀单词的节点继续往下搜,这样就可以加速程序,不用每次重复搜索. 3 如果沿着Trie树已经走到word的叶子节点了,那么就结束这个word的搜索了. 实现好这些思

HDU 1247 Hat&#39;s words(字典树Trie)

解题思路: 判断给出的单词是否恰好由另外两个单词组成,用栈保存每个子字符串的节点,从这个节点出发判断剩下的字符串是否在字典树中即可. #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <map> #include <sta

HDU 1247 简单字典树

Hat’s Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7359    Accepted Submission(s): 2661 Problem Description A hat’s word is a word in the dictionary that is the concatenation of exactly

hdu 1247 Hat’s Words(从给的单词中找hat&#39;s word 并按字典序输出)

1.在使用mp[key]的时候它会去找键值为key的项,如果没有,他会自动添加一个key的项,再把value赋值为相应的初始值(value是int的话赋值为0,string的话赋值为空).所以如果是插入的话可以用insert,如果是查找的话可以使用find,这样可以节省开销.查找的时间复杂度为O(logn) 2. 代码: #include<iostream> #include<string> #include<map> using namespace std; stri

hdu 1247 Hat’s Words Trie树(+测试数据)

Hat’s Words Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1247 Description A hat’s word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary.You a

HDU 1247 Hat&#39;s words(Trie)

HDU 1247 Hat's words(Trie) ACM 题目地址: HDU 1247 Hat's words 题意: 给些单词,问每个单词是否能用另外两个单词拼出. 分析: 直接保存到trie里面,然后暴力切割查询即可. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * File: 1247.cpp * Create Date: 2014-09-24 11:04:11 * Descripton: */ #include <cstdio