Trie数 - 最短前缀
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXS=26;
const int MAXL=22;
const int MAXN=1005;
char ss[MAXN][MAXL];
struct trieNode
{
int num; //num表示用到该节点的字符串的个数,num=1时说明该节点是该字符串唯一的节点
trieNode * next[MAXS];
trieNode()
{
num=0;
for(int i=0;i<MAXS;i++)
next[i]=NULL;
}
}*root;
void Insert(trieNode * rt,char * ss)
{
int i,id,len;
len=strlen(ss);
for(i=0;i<len;i++)
{
id=ss[i]-'a';
if(rt->next[id]==NULL)
rt->next[id]=new trieNode();
rt=rt->next[id];
rt->num++;
}
}
void Search(trieNode * rt,char * s)
{
int i,id,len=strlen(s);
for(i=0;i<len;i++)
{
id=s[i]-'a';
if(rt->num==1) //结束查找,已经找到了最短前缀
break;
printf("%c",s[i]);
rt=rt->next[id];
}
printf("\n");
}
int main()
{
int i,total=0;
root=new trieNode();
while(scanf("%s",ss[total])!=EOF)
{
Insert(root,ss[total]);
total++;
}
for(i=0;i<total;i++)
{
printf("%s ",ss[i]);
Search(root,ss[i]);
}
system("pause");
return 0;
}