24h購物| | PChome| 登入
2011-08-23 13:48:52| 人氣562| 回應0 | 上一篇 | 下一篇

d885. NOIP2007 1.統計數字 番外篇 (HASH重製)

推薦 0 收藏 0 轉貼0 訂閱站台

內容 :

某次科研调查时得到了n个自然数,每个数均不超过15000000001.5*109)。已知不相同的数不超过100000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

輸入說明 :

    每組输入包含n+1行:

    1行是整数n,表示自然数的个数。

    2~n+1行每行一个自然数。

輸出說明 :

    每組输出包含m行(mn个自然数中不相同数的个数),按照自然数从小到大的顺序输出每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。

範例輸入 :

8
2
4
2
4
5
100
2
100

範例輸出 :

2 3
4 2
5 1
100 2

提示 :

100%的数据满足: 1 ≦ n ≦ 5000000,每个数均不超过1 500 000 000(1.5*109

× 自然數改成>=0的整數

出處 :

HASH | AVL | Splay tree (管理:morris1028)



作法 : HASH
/**********************************************************************************/
/*  Problem: d885 "NOIP2007 1.統計數字 番外篇" from HASH | AVL | Splay tree*/
/*  Language: C                                                                   */
/*  Result: AC (498ms, 1180KB) on ZeroJudge                                       */
/*  Author: morris1028 at 2011-08-23 13:45:45                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
#define HAND (1<<17)-1
int HASH[HAND+1], size;
typedef struct {
    int tag, time, next;
} list;
list NODE[100002];
void FreeAll() {
    int a;
    for(a = 0, size = 1; a <= HAND; a++)
        HASH[a] = 0;
}
void insHASH(int n) {
    int m = n&HAND;
    int pre = 0, now = HASH[m];
    while(now) {
        if(NODE[now].tag == n) {NODE[now].time++; return;}
        else if(NODE[now].tag < n)
            pre = now, now = NODE[now].next;
        else    break;
    }
    NODE[size].time = 1, NODE[size].tag = n;
    NODE[size].next = now;
    if(pre) NODE[pre].next = size;
    else    HASH[m] = size;
    size++;
}
int cmp(const void *a, const void *b) {
    list *aa, *bb;
    aa = (list *)a, bb = (list *)b;
    return aa->tag > bb->tag;
}
main() {
    int x, n, a;
    while(scanf("%d", &n) == 1) {
        FreeAll();
        for(a = 0; a < n; a++)
            scanf("%d", &x), insHASH(x);
        qsort(NODE+1, size-1, sizeof(list), cmp);
        for(a = 1; a < size; a++)
            printf("%d %d\n", NODE[a].tag, NODE[a].time);
    }
    return 0;
}

台長: Morris
人氣(562) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: ZeroJudge |
此分類下一篇:d228. kill man
此分類上一篇:a225. 明明愛排列

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文