码迷,mamicode.com
首页 > 其他好文 > 详细

HDU1247 Hat’s Words【字典树】

时间:2015-04-22 14:01:55      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1247


题目大意:

一个"hat‘s word"是一个单词,可以恰好由字典中其他两个单词连接得到(比如字典中是hat‘s和word)。

给出字典中的单词,输出所有的hat‘s word。


思路:

建立字典树,将每个单词都插入到Trie树中,Count统计单词(不是前缀)出现次数。按顺序将每个单词

所有可能的长度拆分成前缀单词和后缀单词,判断这两部分是否都在字典树中,是就是hat‘s word,

进行输出,否则继续拆分当前单词或下一单词。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

struct TrieNode
{
    int Count;
    struct TrieNode *Next[26];
};

TrieNode *root;
char s[50010][110],s1[110],s2[110];

void Create()
{
    root = new TrieNode;
    memset(root->Next,NULL,sizeof(root->Next));
    root->Count = 0;
}

void Insert(char *s)
{
    TrieNode *p, *q;
    p = root;
    while(*s)
    {
        if(p->Next[*s-'a'] == NULL)
        {
            q = new TrieNode;
            memset(q->Next,NULL,sizeof(q->Next));
            q->Count = 0;
            p->Next[*s-'a'] = q;
        }

        p = p->Next[*s-'a'];
        s++;
    }
    p->Count++;
}

int Find(char *s)
{
    TrieNode *p;
    p = root;
    while(*s)
    {
        if(p->Next[*s-'a'] == NULL)
            return 0;
        p = p->Next[*s-'a'];
        s++;
    }
    return p->Count;
}
int main()
{
    int i = 0;
    Create();
    while(cin >> s[i])
    {
        Insert(s[i]);
        i++;
    }
    for(int k = 0; k < i; ++k)
    {
        for(int j = 1; j < strlen(s[k])-1; ++j)
        {
            for(int jj = 0; jj < j; ++jj)
                s1[jj] = s[k][jj];
            s1[j] = '\0';
            strcpy(s2,s[k]+j);
            if(Find(s1) && Find(s2))
            {
                cout << s[k] << endl;
                break;
            }
        }
    }

    return 0;
}


HDU1247 Hat’s Words【字典树】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45192971

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!