字典树

来源:互联网 发布:熊猫智能电视直播软件 编辑:程序博客网 时间:2024/06/05 20:13

  字典树,就是利用数据结构树对多个单词进行存储,以单个字母为节点。在建树的同时对需要的数据进行统计。优点是利用字符串公共前缀,最大限度地减少查询过程中字符的重复比较。

    常见的字典树用于查询含有给定前缀的单词数。

    hihocoder #1014,就是利用类似的题目。。。

          我在刷这道题时,RE了一次由于题目没有看清,在最外层多加了一个while循环(用以多次建树及查询,格式问题导致的错误)。TLE一次,在字符串输入前多加了    fflush(stdin)造成的。。。。。


    初次写博客。。。。   现在上#1014代码


 #include <stdio.h>

#include <stdlib.h>
#include <string.h>

typedef struct Node
{
    int L;
    struct Node* childNode;
}Node;

int main()
{
    int k = 0,i = 0,j = 0,m=0;
    int length = 0,flag = 0;
    char word[11] = "\n";
    Node* pNode = NULL;
    Node forest;
    forest.childNode = malloc(sizeof(Node)*26);
    for(m=0;m<26;m++)
        forest.childNode[m].L = 0;
    forest.L = 0;
    scanf("%d",&k);
    for(i=0;i<k;i++)
    {
        scanf("%s",word);
        length = strlen(word);
        pNode = &forest;
        for(j=0;j<length;j++)
        {
            pNode = &pNode->childNode[word[j]-'a'];
            pNode->L++;
            if(pNode->L == 1)
            {
                pNode->childNode = malloc(sizeof(Node)*26);
                for(m=0;m<26;m++)
                    pNode->childNode[m].L = 0;
            }
        }
    }
    scanf("%d",&k);
    for(i=0;i<k;i++)
    {
        flag = 0;
  //      fflush(stdin);//没必要的,很费时
        scanf("%s",word);
        length = strlen(word);
        pNode = &forest;
        for(j=0;j<length;j++)
        {
            pNode = &pNode->childNode[word[j]-'a'];
            if(pNode->L == 0)
            {
                flag = 1;
                printf("0\n");
                break;
            }
        }
        if(!flag)
            printf("%d\n",pNode->L);
    }
    return 0;
}


0 0
原创粉丝点击