hdu Hat's Words(1247)

Hat’s Words

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8030 Accepted Submission(s): 2905


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
题目大意:

给你一写单词,判定哪些单词可以由这本字典里的其他两个或者两个以上的单词组成。

题目分折:

首先构造字典树,在字典树里只标识哪些单词是存在的,(不考虑前缀的多少了)。对于每一个单词,依照前缀单词 将单词分割,最后从后往前判定,最后的一部分是否被包含在 这本字典的前缀单词中即可。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247

小乐一下:

字典树能够解决的一些问题:

1,统计前缀个数。

2,判定一个单词是否可以由某些前缀组成(本题)

3,统计字典树结点个数(只要在 InsertTrie() 里加一个全局变量,创造结点 +1 即可)

4,快速检索,查找生词(这正是体现了字典树的检索功能)

5,串排序(非常快,但我还没能解决输出,虽说只要是  前序遍历)请指教。

6,递推的优化。(文章解密一题,还没有解决)

7,最长公共前缀(还没有解决)  这些问题,待解决时会一起奉上。


代码:

#include<cstdio>
#include<cstring>
#include<malloc.h>
typedef struct TrieNode{
    int x;
    struct TrieNode * next[26];
}*Trie;
Trie Root;
char str[50010][20];
void InitTrie(Trie &pRoot){pRoot = NULL;}
Trie CreateTrie(){
    Trie p = (Trie)malloc(sizeof(struct TrieNode));
    for(int i = 0;i<26;i++) p->next[i] = NULL;
    p->x = 0;
    return p;
}
void InsertTrie(Trie &pRoot,char *s){
    Trie p;
    int i,k;
    if(!(p=pRoot)) p = pRoot = CreateTrie();
    i = 0;
    while(s[i]){
        k = s[i++] - 'a';
        if(!(p->next[k])) p->next[k] = CreateTrie();
        p = p->next[k];
    }
    p->x = 1;    //这个前缀单词是存在的。
}
bool SearchTrie(Trie &pRoot,char *s){
    int i,k,top;
    Trie p = pRoot;
    int st[1010];
    i = 0;top = 0;
    while(s[i]){
        k = s[i++]-'a';
        //if(p->next[k]==NULL) return false;
        p = p->next[k];
        if(p->x && s[i]) st[top++] = i;  //将一个单词分割成几个部分。
    }
    while(top){  //从后面往前面试探,如果后面的能够在字典树里 找到 存在的前缀单词,那么这个 单词是符合题意的。
        bool ok = true;
        p = pRoot;
        i = st[--top];
        while(s[i]){
            k = s[i++] - 'a';
            if(p->next[k] == NULL) {ok = false;break;}
            p = p->next[k];
        }
        if(p->x && ok) return true;
    }
    return false;   //可以看出,如果只是前缀,那么 top不会自加,因为 s[i] == '\n',而直接返回 false;
}
int main(){
    int cnt = 0;
    while(scanf("%s",str[cnt])!=EOF){
        InsertTrie(Root,str[cnt]);
        cnt++;
    }
    for(int i = 0;i<cnt;i++){
        if(SearchTrie(Root,str[i])) printf("%s\n",str[i]);
    }
    return 0;
}

伟大的梦想成就伟大的人,从细节做好,从点点滴滴做好,从认真做好。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值