hdu 1247 字典树
任务:输出所有可以由其他两个单词组成的单词
如题目中的ahat有a和hat组成
做法:
建立好字典树后拆分单词,把单词分成两段,再在字典树中查找这两段单词是否存在,如果存在就输出,注意输出后要break掉,就这样。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h>
#include<string.h>
#include<math.h>
class trie{
public:
bool flag;
trie *child[26];
trie()
{
flag=false;
memset(child,0,sizeof(child));
}
}root;
void insert(char *s)
{
class trie *cur=&root;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int id=s[i]-'a';
if(!cur->child[id])
cur->child[id]=new trie;
cur=cur->child[id];
}
cur->flag=true;
}
bool find(char *s)
{
class trie *cur=&root;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int id=s[i]-'a';
if(!cur->child[id]) return false;
cur=cur->child[id];
}
if(cur->flag) return true;
return false;
}
char re[50010][50];
int main()
{
int count=0,i,j,k;
char s[50];
while(scanf("%s",s)!=EOF)
{
insert(s);
strcpy(re[count++],s);
}
char tmp1[50],tmp2[50];
for(i=0;i<count;i++)
{
int len=strlen(re[i]);
for(j=1;j<len;j++)
{
memset(tmp1,'\0',sizeof(tmp1));
memset(tmp2,'\0',sizeof(tmp2));
strncpy(tmp1,re[i],j);
strncpy(tmp2,re[i]+j,len-j);
if(find(tmp1)&&find(tmp2))
{
printf("%s\n",re[i]);
break;
}
}
}
return 0;
}