POJ 2001 trie字典树

题目大意:输出唯一能标志该单词的前缀。

思路:建立字典树,在查找字典树的时候输出该单词的字母直到  该单词的字母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;} 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值