字典树

来源:互联网 发布:手机电脑桌面软件2016 编辑:程序博客网 时间:2024/05/21 22:33

今天下午没事,看看了博客,然后呢又学会了一个字典树算法,做了一道入门题:

感觉挺好的,算法学习就是要循序渐进,每天进步一点点,日积月累才会有收获。

现在介绍下字典树:字典树是一种树形结构,它的特点是:

(1)根节点是空的,没有字符。

(2)每个节点都有26个子节点,a,b,c。。。。z.所以把它叫字典树,按字典序排列。

(3)它的详细用途可以咨询百度百科,在acm里面用字典树来查询  从根节点到某一节点

  以这段字符为前缀的字符串出现的次数。(注意:一个字符的前缀就是本身)

  下面附上代码:

http://acm.hdu.edu.cn/showproblem.php?pid=1251杭电1251

#include <iostream>
using namespace std;
struct Node
{
  int n;
  Node * str[26];  
};
void NewNode(Node **Q)
{
  (*Q)=(Node *)malloc(sizeof(Node));
  (*Q)->n=1;
  for(int i=0;i<26;i++)
  {
    (*Q)->str[i]=NULL;
  }
}
void Insert(Node * T,char s[])
{
   int len=strlen(s);
   Node *k=T;
   for(int i=0;i<len;i++)
   {
      if(k->str[s[i]-'a']!=NULL)
      {
          k=k->str[s[i]-'a'];
          k->n=k->n+1;  
      }
      else
      {
          NewNode(&(k->str[s[i]-'a']));
          k=k->str[s[i]-'a'];
      }
   }
   

int find(Node *T,char s[])
{
  int len=strlen(s);
  Node *k=T;
  for(int i=0;i<len;i++)
  {
    if(k->str[s[i]-'a']!=NULL)
    {
       k=k->str[s[i]-'a'];
    }
    else
    {
        return 0;
    }
  }
  return k->n;
}
int main()
{
  char s[20];
  Node *q=NULL;
  NewNode(&q);
  while(gets(s))
  {
     if(s[0]==0)
        break;
     Insert(q,s);
      
  }
  while(cin>>str)
  {
   int num=find(q,str);
   cout<<num<<endl;   
  }
  
  return 0;  
}

0 0