您的位置:首页 > 其它

hdu 1247 Hat’s Words

2012-07-27 16:11 357 查看

Hat’s Words

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


[align=left]Problem Description[/align]
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.

[align=left]Input[/align]
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.

[align=left]Output[/align]
Your output should contain all the hat’s words, one per line, in alphabetical order.

[align=left]Sample Input[/align]

a
ahat
hat
hatword
hziee
word

[align=left]Sample Output[/align]

ahat
hatword

[align=left]Author[/align]
戴帽子的

[align=left]Recommend[/align]
Ignatius.L
//字典树、速度够快的、就是太占空间呀
//判断每个单词是否由给的单词表里的2个单词组成
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#define N 60000
#define Size 26
using namespace std;
struct Tire
{
bool isword;
Tire *next[Size];
}node
;
char s[50000][20];
int nu;
void insert(Tire *&root,char *word)
{
Tire *p=root;
while(*word)
{
if(p->next[*word-'a']==NULL)
p->next[*word-'a']=&node[++nu];
p=p->next[*word-'a'];
word++;
}
p->isword=true;
}
bool ask(Tire *root,char *word)
{
Tire *p=root;
while(*word)
{
if(p->next[*word-'a']==NULL)
return false;
p=p->next[*word-'a'];
word++;
}
if(p->isword) return true;
return false;
}
bool query(Tire *root,char *word)
{
Tire *p=root;
while(*word)
{
if(p->next[*word-'a']==NULL)
return false;
p=p->next[*word-'a'];
if(p->isword&&ask(root,word+1))
return true;
word++;
}
return false;
}
int main()
{
int n=-1;
Tire *root=&node[0];
root->isword=false;
while(scanf("%s",s[++n])!=EOF)
{
insert(root,s
);
}
for(int i=0;i<=n;i++)
if(query(root,s[i]))
printf("%s\n",s[i]);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: