hdu1247(字典树)
http://acm.hdu.edu.cn/showproblem.php?pid=1247
题意:给你一连串的单词,输出其中可以由所给出的两个单词(可以自己和自己组成)组成的单词。
思路:建好字典树后,枚举单词的组成就好。
#include<iostream>
#include<cstring>
using namespace std;
typedef struct tree
{
tree *next[26];
int flag;
}tree;
tree *root=(tree *)malloc(sizeof(tree));
char s[50000][50];
void creat(char str[])
{
int len=strlen(str);
tree *p=root,*q;
for(int i=0;i<len;i++)
{
int x=str[i]-'a';
if(p->next[x])
{
p=p->next[x];
}
else
{
q=(tree *)malloc(sizeof(tree));
q->flag=0;
for(int j=0;j<26;j++)
q->next[j]=NULL;
p->next[x]=q;
p=q;
}
}
p->flag=1;
}
int find(char str[])
{
int len=strlen(str);
tree *p=root;
for(int i=0;i<len;i++)
{
int x=str[i]-'a';
if(p->next[x])
p=p->next[x];
else
return 0;
}
return p->flag;
}
void del(tree *root)
{
for(int i=0;i<26;i++)
{
if(root->next[i])
del(root->next[i]);
}
free(root);
}
int main()
{
for(int i=0;i<26;i++)
root->next[i]=NULL;
root->flag=0;
char t[50];
int k=0;
while(scanf("%s",t)>0)
{
strcpy(s[k++],t);
creat(t);
}
for(i=0;i<k;i++)
{
int len=strlen(s[i]);
for(int j=1;j<len;j++)
{
char t1[50],t2[50];
strcpy(t1,s[i]);
t1[j]='\0';
strcpy(t2,s[i]+j);
if(find(t1)&&find(t2))
{
puts(s[i]);
break; //输出单词后就跳出循环,以免重复输出
}
}
}
del(root);
return 0;
}
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号