分析:字典树解决,注意节点里面只需要保存该点是否构成一个单词,和匹配类型的题有所区别;另外要注意重读打印。字典树效率高。
#include<iostream>
using namespace std;
struct Tri
{
bool v;
Tri* child[26];
};
Tri* root;
void Init()
{
root->v=false;
for(int i=0;i<26;i++)
{
root->child[i]=NULL;
}
}
void CreateDic(char* str)
{
Tri* p;
int j;
p=root;
while(*str!=NULL)
{
if(p->child[*str-'a']==NULL)
{
p->child[*str-'a']=(Tri*)new Tri;
p->child[*str-'a']->v=false;
for(j=0;j<26;j++)
p->child[*str-'a']->child[j]=NULL;
}
p=p->child[*str-'a'];
str++;
}
p->v=true;
}
bool Find(char* str)
{
Tri* p=root;
while(*str!=NULL)
{
if(p->child[*str-'a']==NULL)
return 0;
p=p->child[*str-'a'];
str++;
}
return p->v;
}
void Del(Tri* p)
{
for(int i=0;i<26;i++)
if(p->child[i])
Del(p->child[i]);
Del(p);
}
char total[50002][100];
int main()
{
char a[100],b[100],c[100];
int i=0,j,k;
root=(Tri*)new Tri;
Init();
while(gets(a))
{
CreateDic(a);
strcpy(total[i++],a);
}
for(j=0;j<i;j++)
{
for(k=1;k<strlen(total[j]);k++)
{
strncpy(b,total[j],k);
b[k]='\0';
strcpy(c,total[j]+k);
if(Find(b)&&Find(c))
{
cout<<total[j]<<endl;
break; //注意查找成功后,一定要跳出循环,否则会重复输出
}
}
}
return 0;
}HDU ACM 1247-Hat’s Words-字典树(Trie)
原文地址:http://blog.csdn.net/a809146548/article/details/45157539