zoukankan      html  css  js  c++  java
  • 南阳oj 题目290 动物统计加强版 字典树

    动物统计加强版

    时间限制:3000 ms | 内存限制:150000 KB
    难度:4

    描述
    在美丽大兴安岭原始森林中存在数量繁多的物种,在勘察员带来的各种动物资料中有未统计数量的原始动物的名单。科学家想判断这片森林中哪种动物的数量最多,但是由于数据太过庞大,科学家终于忍受不了,想请聪明如你的ACMer来帮忙。

    输入
    第一行输入动物名字的数量N(1<=N<= 4000000),接下来的N行输入N个字符串表示动物的名字(字符串的长度不超过10,字符串全为小写字母,并且只有一组测试数据)。
    输出
    输出这些动物中最多的动物的名字与数量,并用空格隔开(数据保证最多的动物不会出现两种以上)。
    样例输入
    10
    boar
    pig
    sheep
    gazelle
    sheep
    sheep
    alpaca
    alpaca
    marmot
    mole
    样例输出
    sheep 3
    对于初学者的我来说,这题真坑,先是用结构体,然后在用map,尽自己最大能力对上述两种方法进行优化,然而还是超时。┭┮﹏┭┮
    最后百度看到了用字典树去写,就去学习了。没学过数据结构的我,去理解链表,难受香菇。
    不知道有没有比字典树 等节省时间的方法,应该有吧,以后在更新吧。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    struct node
    {
        node *next[26];//node 类的26个子类
        int num;//类的个数
        node()//构造函数 对类成员初始化
        {
            memset(next,0,sizeof(next));
            num=0;
        }
    };
    int Max=-123;//记录最大的个数
    char b[12];//记录最大的字符串
    node *top=new node();//申请一个node类的 作为所有类的根
    void lianbiao(char *a)//将新字符串插入
    {
        node *p=top;//node 类的指针 ,指向类的根
        int k;
        for(int i=0;a[i];i++)
        {
            k=a[i]-'a';
            if(p->next[k]==NULL)//判断是否存在这个字符节点  不存在则创建
                p->next[k]=new node();
            p=p->next[k];//更新p的指向下一个节点
        }
        p->num++;//字符串出现个数加一
        if(p->num>Max)//更新最大值 和字符串
        {
            Max=p->num;
            strcpy(b,a);
        }
    }
    int main()
    {
        int l;
        scanf("%d",&l);
        char a[12];
        while(l--)
        {
            scanf("%s",&a);
            lianbiao(a);//将新字符串插入
        }
        printf("%s %d",b,Max);
        return 0;
    }
    
  • 相关阅读:
    为什么硬链接不能链接目录、文件inode 和目录 dentry 的区别联系
    LVM 详解
    pwd 命令详解
    type 命令详解
    查看文件中字符出现次数
    lesson
    xml linq
    新系统配置
    空合并运算符(??):
    dos.ORM配置和使用
  • 原文地址:https://www.cnblogs.com/nanfenggu/p/7900116.html
Copyright © 2011-2022 走看看