hdu1251

并查集告一段落啦,先放下吧,今晚再做一下总结吧

之后转入字典树的学习

这道题目是比较基础的而且明显的字典树

慢慢来吧

题意比较明显,查找以某一个串为前缀的单词的数目,字典树还有一个名称,就是前缀树,所以就很明显了吧

不过下面的代码用的是比较朴素的方法,root->next[],开的内存太大了,不过速度也相对快了

root->cnt记录的是以从根节点到达该节点组成的串为前缀的单词的个数

此题涉及到字典树的俩个基本操作,插入还有查找,代码很容易理解

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
    int cnt;
    struct node *next[26];
}*tree,t;
tree root;
void insert(char *str)
{
    tree p=root,newnode;
    for(;*str!='\0';str++)
    {
        if(p->next[*str-'a']!=NULL)
        {
            p=p->next[*str-'a'];
            p->cnt++;
        }
        else
        {
            newnode=(tree)malloc(sizeof(t));
          for(int i=0;i<26;i++)
            newnode->next[i]=NULL;
          newnode->cnt=1;
          p->next[*str-'a']=newnode;
          p=newnode;
        }
    }
}
int find(char *str)
{
    tree p=root;
    for(;*str!='\0';str++)
    {
        if(p->next[*str-'a']!=NULL)
        p=p->next[*str-'a'];
        else return 0;
    }
    return p->cnt;
}
int main()
{
    char str[16];
    root=(tree)malloc(sizeof(t));
    for(int i=0;i<26;i++)
        root->next[i]=NULL;
    root->cnt=0;//根节点初始化当然为0,不包含任何字母
    while(gets(str))
    {
        if(strcmp(str,"")==0)
            break;
        insert(str);
    }
    while(gets(str))
    {
        //if(strcmp(str,"")==0)
            //break;
        printf("%d\n",find(str));
    }
    return 0;
}
posted @   枕边梦  阅读(953)  评论(3编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示