又扒了一段代码 很简单 注释自己看
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX = 26; //26个字母 若构成字典树是二进制数 MAX=2;
struct Trie //内部所需可自己定义
{
Trie *next[MAX];
bool isword;
Trie () { for(int j=0;j<MAX;j++)next[j] = NULL;
isword = false;}
};
Trie *root = new Trie;
char word[50000][30];
void createTrie(char str[])
{
int len = strlen(str);
Trie *p = root,*q = NULL;
for(int i=0;i<len;i++)
{
int id = str[i]-'a'; //asii码检索
if(p->next[id]==NULL)
{
q = new Trie;
q->isword = false;
p->next[id] = q; //后插
}
if(i==len-1)
p->next[id]->isword = true; //最后一个插入,一个单词生成!
p = p->next[id]; //next[id]是个Trie 指针 指向下一个
}
}
bool findTrie(char str[])
{
int len = strlen(str);
Trie *p = root;
for(int i=0;i<len;i++)
{
int id = str[i]-'a';
if(p->next[id]==NULL)
{
return false;
}
p = p->next[id];
}
if(p->isword) //找到len若查找的单词不作为一个单词(只是有单词包括在内)在字典树里
return true;
else
return false;
}
void del(Trie *root) //释放字典树 可写在结构体内
{
for(int i=0;i<MAX;i++)
{
if(root->next[i]!=NULL)
{
del(root->next[i]);
}
}
delete root;
}
int main()
{
int num=0;
char str1[30],str2[30];
while(gets(word[num]))
{
createTrie(word[num]);
num++;
} //建树
for(int i=0;i<num;i++)
{
int len = strlen(word[i]);
if(len==1)
continue;
for(int j=0;j<len;j++)//从每个单词的各部分拆开
{
int k;
if(j==len-1) continue;
for(k=0;k<=j;k++)
{
str1[k] = word[i][k];
}
str1[k]='\0'; //串尾结束标志
int k2=0;
for(int l=k;l<len;l++)
{
str2[k2++]=word[i][l];
}
str2[k2]='\0';
if(findTrie(str1)&&findTrie(str2))
{
cout<<word[i]<<endl;
break;//
}
}
}
del(root);
return 0;
}