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 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

题意:在一些字符串中,找到这样字符串:由两个其他的字符串构成(也可能是由同一个单词两次构成 )!

祝猿们AC愉快!第一次写博客....文笔不好。 只因这题虐我伤痕累累,(呜呜~>_<~+)好不容易写出来了,就总结了一下..这也预示着我的博客之旅的开启!   √(─皿─)√

自己写的几组测试数据:
Input:
a
aa
aaa
Output:
aa
aaa
Input:
ab
cd
abcdef
abcd
Output:
abcd

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string.h>
#define N 26
#define PI acos(-1.0)
using namespace std;
typedef struct Trie
{
    int sum;
    int flag;
    struct Trie *next[N];
};
Trie *root=NULL;
Trie *Newnode()/*初始化树*/
{
    Trie *p=(Trie *)malloc(sizeof(Trie));
    p->sum=0;
    p->flag=0;
    for(int i=0; i<N; i++)
        p->next[i]=NULL;
    return p;
}
void creatTire(char *s)/*建树   这个可以作为模版*/
{
    int i,len=strlen(s);
    Trie *p=root;
    for(i=0; i<len; i++)
    {
        int k=s[i]-‘a‘;
        if(p->next[k]==NULL)
            p->next[k]=Newnode();
        p=p->next[k];
        p->sum++;
    }
    p->flag=1;/*标记一个字符串的最后一个单词*/
}
void del(Trie *p)/*清除树*/
{
    int i;
    if(p==NULL)
        return ;
    for(i=0; i<N; i++)
        if(p->next[i]!=NULL)
            del(p->next[i]);
    free(p);
}
int findTire(char *s)
{
    Trie *p=root;
    int n=strlen(s),i;
    for(i=0; i<n; i++)
    {
        int j,k;
        k=s[i]-‘a‘;
        p=p->next[k];
        if(p==NULL)
            break;
        if(p->flag==1&&i!=n-1)/*找到了匹配的前半部分*/
        {
            j=i+1;
            Trie *q=root;
            for(; j<n; j++) /*找后半部分*/
            {
                k=s[j]-‘a‘;
                q=q->next[k];
                if(q==NULL)
                    break;
                if(q->flag==1&&j==n-1)/*j==n-1表示完全匹配*/
                    return 2;/*返回2说明找到符合题意的了*/
            }
            //return 1;/*在这错了好久,要是找到了前半部分但是没找到匹配的后半部分应该把前半部分的下标向后移,继续判断!*/
        }
    }
    return 0;
}
char s[51000][110];
int main()
{
    int n,i=0,j;
    root=Newnode();/*这儿要注意了  别忘了加上这一句*/
    while(scanf("%s",s[i])!=EOF)/*有一些人说用ges错  就不太清楚了*/
    {
        creatTire(s[i]);
        i++;
    }
    for(j=0; j<i; j++)
    {
        n=findTire(s[j]);
        if(n==2)
            printf("%s\n",s[j]);
    }
    //del(root);
    return 0;
}
时间: 2024-10-08 00:31:23

hdu 1247 Hat’s Words Trie树(+测试数据)的相关文章

hdu 1247 Hat’s Words 字典树

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

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’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 字典树,还是比较有意思的题目

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

//那个单词是有出现的两个单词构成的 # 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

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&#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)

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