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): 16230    Accepted Submission(s): 5790

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

戴帽子的

Recommend

Ignatius.L   |   We have carefully selected several similar problems for you:  1075 1298 1800 2846 1305

题意是 在输入的字符串中,如果一个字符串能由另外两个字符串拼接而成,就输出这个字符串

分析:   枚举每一个字符串分成两个字符串的结果,看这两个字符串是否能够找到

代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN=26;  //只有小写字母
typedef struct Trie{
   bool v;
   Trie *next[MAXN];
}Trie;
Trie *root;
char s1[100];
char s2[100];
void createTrie(char *str)
{
    int len=strlen(str);
    Trie *p=root,*q;
    for(int i=0;i<len;i++)
    {
     int id=str[i]-‘a‘;
     if(p->next[id]==NULL)
     {
         q=(Trie*)malloc(sizeof(Trie));
         q->v=false;              //每次建立新节点进行初始化操作
         for(int j=0;j<MAXN;j++)
            q->next[j]=NULL;
         p->next[id]=q;
         p=p->next[id];
     }
     else
     {
      //   p->next[id]->v=false;
         p=p->next[id];
     }
    }
    if(p!=root)  //p==root 代表读入的是空串
    p->v=true;     //表示以此结点结尾的字符串存在
}
bool findTrie(char *str)
{
    int len=strlen(str);
    Trie *p=root;
    for(int i=0;i<len;i++)
    {
        int id=str[i]-‘a‘;
        p=p->next[id];
        if(p==NULL)
            return false;
    }
    return p->v;
}
int  deal(Trie *T)
{
    int i;
    if(T==NULL)
        return 0;
    for(int i=0;i<MAXN;i++)
    {
        if(T->next[i]!=NULL)
            deal(T->next[i]);
    }
    free(T);
    return 0;
}
int main()
{
    char str[50010][100];
    int t,n,flag,cnt;
    root=(Trie*)malloc(sizeof(Trie));
    for(int i=0;i<MAXN;i++)
      root->next[i]=NULL;
      root->v=false; //初始化
     cnt=0;
     while(gets(str[cnt]))
     {
         createTrie(str[cnt]);
         cnt++;
     }
  //   cout<<findTrie("a")<<" "<<findTrie("hat")<<endl;
  for(int k=0;k<cnt;k++){
        n=strlen(str[k]);
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<i;j++)
            s1[j]=str[k][j];
         s1[i]=‘\0‘;
         for(int j=i;j<=n-1;j++)
          s2[j-i]=str[k][j];
         s2[n-i]=‘\0‘;
     if(findTrie(s1)&&findTrie(s2))
     {
       printf("%s\n",str[k]);
       break;
    }
  }
  }
    deal(root);
    return 0;
}
时间: 2024-11-07 12:30:25

HDU 1247 Hat’s Words(字典树)的相关文章

hdu 1247 Hat’s Words 字典树

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

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): 8843    Accepted Submission(s): 3171 Problem Description A hat's word is a word in the dictionary that is the concatenation of exactl

HDU 1247 Hat’s Words (字典树&#183;Trie)

题意  给你一个字典  输出字典中能表示成两个单词连接的所有单词 最基础的字典树应用  先把所有单词加入字典树中  标记每个结点是否为某个单词的结尾  然后查找每个单词  在树上查询过程中遇到单词结尾时  如果剩下的后缀也是一个单词  那当前查询的单词就可以是两个单词的连接了 #include <cstdio> #include <cstring> using namespace std; const int N = 50005; int n; char ss[N][20]; st

hdu 1247 Hat’s Words (字典树模板)

//那个单词是有出现的两个单词构成的 # include <cstdio> # include <cstring> # include <algorithm> # include <iostream> # define MAX 26 using namespace std; typedef struct Trie_Node { bool isWord; struct Trie_Node *next[MAX]; } Trie; char s[50000][50

hdoj 1247 Hat’s Words(字典树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247 思路分析:题目要求找出在输入字符串中的满足要求(该字符串由输入的字符串中的两个字符串拼接而成)的字符串. 对于长度为LEN的字符串,其可能由LEN种可能的拼接可能:现在问题转化为查找能够拼接成该字符串的可能的两个字符串是否都在 输入的字符串中,使用字典树可以实现快速的字符串查找,算法复杂度为O(N*M),N为输入字符串的个数,M为字符串长度. 代码如下: #include <cstdio>

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 (字典树)

[题目链接]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(字典树,经典题)

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&#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(map,STL,字符处理,string运用)

题目 用map写超便捷 也可以用字典树来写 我以前是用map的: #include<stdio.h> #include<string.h> #include<algorithm> #include<string> #include<math.h> #include <iostream> #include<map> using namespace std; string word[50010]; int main() { i