动物统计加强版 Trie 树

动物统计加强版

时间限制: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

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<queue>
#include<deque>
#include<iomanip>
#include<vector>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<fstream>
#include<memory>
#include<list>
#include<string>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define MAXN 4000004
#define L 31
#define INF 1000000009
#define eps 0.00000001
/*
Trie 树
*/
typedef struct node
{
    int cnt;
    struct node* next[26];
}*Tree;
char tmp[11];
int alloc = 0, ans = 0, n;
Tree Newnode()
{
    Tree T = (Tree)malloc(sizeof(node));
    T->cnt = 0;
    for (int i = 0; i < 26; i++)
    {
        T->next[i] = NULL;
    }
    return T;
}
void Insert(Tree T, char s[])
{
    int p = 0;
    while (s[p] != '')
    {
        int k = s[p] - 'a';
        if (!T->next[k])
            T->next[k] = Newnode();
        T = T->next[k];
        p++;
    }
    T->cnt++;
    if (T->cnt > ans)
    {
        memcpy(tmp, s, sizeof(s));
        ans = T->cnt;
    }
}
int main()
{
    scanf("%d", &n);
    char s[11];
    Tree T = Newnode();
    for (int i = 0; i < n; i++)
    {
        scanf("%s", s);
        Insert(T, s);
    }
    printf("%s %d
",tmp, ans);
}
原文地址:https://www.cnblogs.com/joeylee97/p/6895903.html