hdu 1251 统计难题


这是我第一次接触字典树,感觉还不是很不熟悉。这是仿照别人的代码写出来的。

但是我还不是理解,为什么要用 

#include <stdio.h>
#define MAX 26
typedef struct TriNode
{
       int count;
       struct TriNode *next[MAX];
}TriNode;
int t=0;
TriNode a[1000000];

void InitTriNode(TriNode ** proot)
{
     *proot=NULL;
}

TriNode * CreatTriNode()
{
        int i;
        TriNode *p=&a[t++];
        p->count=1;
        for(i=0;i<MAX;i++)
        {
                p->next[i]=NULL;
        }
        return p;
}

void InsertTriNode(TriNode ** proot,char *s)
{
     TriNode *p;
     int i=0,k;
     if(!(p=*proot))
     {
                    p=*proot=CreatTriNode();
     }
     while(s[i])
     {
                k=s[i++]-'a';
                if(p->next[k])
                {
                              p->next[k]->count++;
                }
                else
                {
                    p->next[k]=CreatTriNode();
                }
                p=p->next[k];
     }
}

int Search (TriNode **proot,char *s)
{
    TriNode *p;
    int i=0,k;
    if(!(p=*proot))
    {
                   return 0;
    }
    while(s[i])
    {
               k=s[i++]-'a';
               if(p->next[k]==NULL)
               {
                             return 0;
               }
               else
               {
                   p=p->next[k];
               }
    }
    return p->count;
}

int main()
{
    char s[11];
    TriNode *proot=NULL;
    InitTriNode(&proot);
    while(gets(s)&&s[0])
    {
                        InsertTriNode(&proot,s);
    }
    while(gets(s))
    {
                  printf("%d\n",Search(&proot,s));
    }
    return 0;
}
    
    
        
        

自己对字典树的理解:

字典树就是构造一颗由字母构成的树。数的根节点没有储存任何东西,为空,特别要突出根节点(*Proot)。每个节点储存的是该节点的子节点*next[MAX]和该节点出现的次数。构造一颗完整的字典树要用到,初始化函数,插入函数,删除函数,搜索函数等。





第二次自己写的代码:

#include <iostream>
#include <stdio.h>
using namespace std;
#define MAX 26
typedef struct Trie
{
        int count;
        Trie *next[MAX];
}Trie;
Trie *root;
Trie * CreatTrie()
{
     Trie *p;
     p->count=1;
     for(int i=0;i<MAX;i++)
     {
             p->next[i]=NULL;
     }
     return p;
}             
void Insert(char *s)
{
     Trie *p=root;
     int i=0,k;
     while(s[i])
     {
                k=s[i++]-'a';
                if(p->next[k]==NULL)
                {
                                    p->next[k]=new Trie();
                                    p->next[k]->count=1;
                }
                else
                {
                    p->next[k]->count++;
                }
                p=p->next[k];
     }
}

int Search(char *s)
{
    Trie *p=root;
     int i=0,k;
     while(s[i])
     {
                k=s[i++]-'a';
                if((p->next[k])==NULL)
                {
                                    return 0;
                }
                p=p->next[k];
     }
     return p->count;
}

int main()
{
    char s[100];
    root=new Trie();
    while(gets(s)&&s[0])
    {                                  
                       Insert(s);
    }
    while(gets(s))
    {
                       printf("%d\n",Search(s));
    }
    return 0;
}




其实这个只要理解了就很简单了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值