zoukankan      html  css  js  c++  java
  • hdu1251 hash或者字典树

    题意:


    统计难题
    Problem Description
    Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).

    Input
    输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.注意:本题只有一组测试数据,处理到文件结束.

    Output
    对于每个提问,给出以该字符串为前缀的单词的数量.

    Sample Input
    banana
    band
    bee
    absolute
    acm


    ba
    b
    band
    abc
     

    Sample Output
    2
    3
    1
    0

    思路:  

          两种做法,一个是hash就是把每个给定的串拆成len个串,然后hash[now_str] ++ ,在询问的时候直接输出hash[str]就行了,这里的hash我用容器实的,map<string ,int>,或者这个题目可以用字典树实现,字典树实现也很简单,就是基本的在每个节点上记录当前这个节点出现了多少次,然后查找就行了。下面给出两个方法的代码。


    hash

    #include<stdio.h>
    #include<string.h>
    #include<string>
    #include<map>
    
    using namespace std;
    
    char str[15];
    map<string ,int>my_map;
    
    int main ()
    {
        my_map.clear();
        while(gets(str) ,strlen(str))
        {
            int i ,l = strlen(str);
            char temp[15];
            for(i = 0 ;i < l ;i ++)
            {
                temp[i] = str[i];
                temp[i+1] = '';
                my_map[temp]++;
            } 
        }
        while(gets(str))
        {
            printf("%d
    " ,my_map[str]);
        }
        return 0;
    }
        
    
    
    

    字典树


    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    typedef struct Tree
    {
        Tree *next[26];
        int v;
    }Tree;
    
    Tree root;
    
    void Buid_Tree(char *str)
    {
        int len = strlen(str);
        Tree *p = &root ,*q;
        for(int i = 0 ;i < len ;i ++)
        {
           int id = str[i] - 'a';
           if(p -> next[id] == NULL)
           {
              q = (Tree *) malloc(sizeof(root));
              q -> v = 1;
              for(int j = 0 ;j < 26 ;j ++)
              q -> next[j] = NULL;
              p -> next[id] = q;
              p = p -> next[id];
            }
            else
            {
               p -> next[id] -> v ++;
               p = p -> next[id];
            }
         }
    }
    
    int Find(char *str)
    {
        int len = strlen(str);
        Tree *p = &root;
        for(int i = 0 ;i < len ;i ++)
        {
            int id = str[i] - 'a';
            p = p -> next[id];
            if(p == NULL) return 0;
        }
        return p -> v;
    }
    
    int main ()
    {
        char str[15];
        for(int i = 0 ;i < 26 ;i ++)
        root.next[i] = NULL;
        while(gets(str) && str[0] != '')
        {
           Buid_Tree(str);
        }
        while(~scanf("%s" ,str))
        {
           printf("%d
    " ,Find(str));
        }
       return 0;
    }
    
    




  • 相关阅读:
    前言(CSDN也有Markdown了,好开森)
    One usage of recurison: the tower of Hanoi
    使用Android注解来改善代码
    mysql生产环境____主从同步修复案例
    不同类型的指针
    C++ 对象模型
    为什么需要模版成员方法
    理解 traits
    C++ 异常处理
    传const引用代替传值
  • 原文地址:https://www.cnblogs.com/csnd/p/12062995.html
Copyright © 2011-2022 走看看