题目大意:输出唯一能标志该单词的前缀。
思路:建立字典树,在查找字典树的时候输出该单词的字母直到 该单词的字母cnt=1 或者读完整个单词
#include<iostream>
using namespace std;
char tmp[1001][21];
struct node
{
node *next[26];
int cnt;
}*root ;
void maketrie(char tmp1[])
{
node *r=root;// 联系根树
node *tep;
for(int i=0;i<strlen(tmp1);i++)
{
if(r->next[tmp1[i]-'a']==NULL) //第一次处理的字母就要分配新的节点。单链表尾插法建立:分配新节点,连接前驱,移动工作指针到最新的节点上
{
tep=new node;
for(int j=0;j<26;j++)
tep->next[j]=NULL;
tep->cnt=0;
r->next[tmp1[i]-'a']=tep;
}
r=r->next[tmp1[i]-'a'];
r->cnt++;
}
}
void search_trie(char tmp2[])
{
node *r=root; //工作指针的建立,相对于每一个串
for(int i=0;i<strlen(tmp2);i++)
{
r=r->next[tmp2[i]-'a'];
cout<<tmp2[i];
if(r->cnt==1)
break;
}
cout<<endl;
}
int main()
{
int sum=0;
root=new node; //初始建立的根节点
for(int i=0;i<26;i++)
root->next[i]=NULL;
while(cin>>tmp[sum])
{
maketrie(tmp[sum]);//
sum++;
}
for(int i=0;i<sum;i++)
{
cout<<tmp[i]<<' ';
search_trie(tmp[i]);
}
system("pause");
return 0;}