标签:
题目链接:
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;
}
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/45192971