zoukankan      html  css  js  c++  java
  • HDU 1251 统计难题 字典树/STL

    统计难题
    Time Limit:2000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u
     

    Description

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

    Input

    输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 

    注意:本题只有一组测试数据,处理到文件结束. 
     

    Output

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

    Sample Input

    banana
    band
    bee
    absolute
    acm
    ba
    b
    band
    abc
     

    Sample Output

    2
    3
    1
    0
     
     
    第一种是普通的字典树做法 网上找了个模板  指针这东西真是玄学啊 
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    #include <vector>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    
    typedef long long LL;
    
    struct node
    {
        int count;
        node *childs[26];
        node()
        {
            count=0;
            for(int i=0;i<26;i++)
                childs[i]=NULL;
        }
    };
    
    node *root=new node;
    node *current,*newnode;
    
    void insert(char *str)
    {
        int m;
        int len=strlen(str);
        current=root;
        for(int i=0;i<len;i++)
        {
            m=str[i]-'a';
            if(current->childs[m]!=NULL)
            {
                current=current->childs[m];
                ++(current->count);
            }
            else
            {
                newnode=new node;
                ++(newnode->count);
                current->childs[m]=newnode;
                current=newnode;
            }
        }
    }
    
    int search(char *str)
    {
        int m;
        current=root;
        int len=strlen(str);
        for(int i=0;i<len;i++)
        {
            m=str[i]-'a';
            if(current->childs[m]==NULL)
                return 0;
            current=current->childs[m];
        }
        return current->count;
    }
    
    int main()
    {
        //freopen("input.txt","r",stdin);
        char str[26];
        while(gets(str))
        {
            int len=strlen(str);
            if(len==0)
                break;
            insert(str);
    
        }
        while(gets(str)!=NULL)
        {
            printf("%d
    ",search(str));
        }
    }
    

      

    然后再来说说神奇的map

    仰望高端玄学

    #include <iostream>
    #include <cstdio>
    #include <map>
    #include <string.h>
    using namespace std;
    
    char str[25];
    
    int main()
    {
        //freopen("input.txt","r",stdin);
        map<string,int> m;
        while(gets(str))
        {
            int len=strlen(str);
            if(len==0)
                break;
            for(int i=len;i>0;i--)
            {
                str[i]='';
                m[str]++;
            }
    
        }
        while(gets(str))
        {
            printf("%d
    ",m[str]);
        }
    }
    

      

     
     
     
     
     
     
     
     
  • 相关阅读:
    神经网络反向传播时的梯度计算技巧
    调整Virtual Box硬盘大小
    suse glibcxx版本过高问题
    linux命令之----sort命令用于将文本文件内容加以排序
    ffmpeg编码中的二阻塞一延迟
    Linux下查看编辑二进制文件:hexedit神器
    Unity3D之Mecanim动画系统学习笔记(二):模型导入
    Unity3D之Mecanim动画系统学习笔记(一):认识Mecanim动画系统
    TypeScript学习笔记(六):泛型
    TypeScript学习笔记(五):接口
  • 原文地址:https://www.cnblogs.com/Hyouka/p/5716467.html
Copyright © 2011-2022 走看看