1. 程式人生 > >nyoj 290 動物統計加強版 (字典樹 PS:map<TLE>)

nyoj 290 動物統計加強版 (字典樹 PS:map<TLE>)

輸入 實現 lan span amp == spl can hdu

動物統計加強版

時間限制: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
/**
    PS:這道題第一反應就是用map但用map提交兩次都超時??????

    數據結構:字典樹

**/

模板 struct node、 void my_insert(char *s)、 root:

 1 struct node
 2 {
 3     node *next [26];
 4     int cnt;
 5     node ()
 6     {
 7         cnt = 0;
 8         memset (next, 0
, sizeof (next)); 9 } 10 }; 11 12 node *root = new node (); 13 14 void my_insert (char *s) 15 { 16 node *p = root; 17 int i, k, len = strlen (s); 18 for (i = 0; i < len; ++ i) 19 { 20 k = s [i] - a; 21 if (p->next [k] == NULL) 22 p->next [k] = new
node (); 23 p = p->next [k]; 24 } 25 p->cnt ++; 26 if (p->cnt > my_max) 27 { 28 my_max = p->cnt; 29 strcpy (ans, s); 30 } 31 }

C/C++代碼實現(AC):

#include <bits/stdc++.h>

using namespace std;

int n, my_max = -1;

char temp [15], ans [15];

struct node
{
    node *next [26];
    int cnt;
    node ()
    {
        memset (next, 0, sizeof (next));
        cnt = 0;
    }
};

node *root = new node(); // new 與 malloc 類似都是開辟內存空間的意思

void my_resert (char *s)
{
    node *p = root;
    int i, k, len = strlen (s);
    for (i = 0; i < len; ++ i)
    {
        k = s [i] - a;
        if (p->next [k] == NULL)
            p->next [k] = new node();
        p = p->next [k];
    }
    p->cnt ++;
    if (p->cnt > my_max)
    {
        my_max = p->cnt;
        strcpy (ans, s);
    }
    return ;
}

int main()
{
    scanf ("%d", &n);
    while (n --)
    {
        scanf ("%s", temp);
        my_resert (temp);
    }
    printf ("%s %d", ans, my_max);
    return 0;
}

hdu 1251 統計難題 http://acm.hdu.edu.cn/showproblem.php?pid=1251

nyoj 290 動物統計加強版 (字典樹 PS:map<TLE>)