5-14 电话聊天狂人 (25分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数N(≤105),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:
13588625832 3
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<algorithm> #define MAX 1000001 #define MAXD 5 #define TELNUM 11 using namespace std; struct LNode{ char data[12]; int count; struct LNode *next; }; typedef struct LNode *PtroToLNode; struct HNode{ int Tablesize; PtroToLNode Heads; }; typedef struct HNode *HashTable; int Nextprime(int Tablesize) { int i; int p = (Tablesize % 2) ? Tablesize + 2 : Tablesize + 1; while(p <= MAX) { for(i = sqrt(p); i > 2; i--) { if(!(p%i))break; } if(i == 2)break; else { p += 2; } } return p; } HashTable create(int Tablesize) { HashTable H = (HashTable)malloc(sizeof(struct HNode)); H->Tablesize = Nextprime(Tablesize); H->Heads = (PtroToLNode)malloc(H->Tablesize * sizeof(struct LNode)); for(int i = 0; i < H->Tablesize; i++) { H->Heads[i].data[0] = '\0'; H->Heads[i].count = 0; H->Heads[i].next = NULL; } return H; } int Hash(int Key,int p) { return Key%p; } PtroToLNode Find(HashTable H,char Key[]) { PtroToLNode p; int pos; pos = Hash(atoi(Key + TELNUM - MAXD),H->Tablesize); p = H->Heads[pos].next; while(p && strcmp(p->data,Key)) { p = p->next; } return p; } bool Insert(HashTable H,char Key[]) { PtroToLNode p,newnode; int pos; p = Find(H,Key); if(!p) { newnode = (PtroToLNode)malloc(sizeof(struct LNode)); strcpy(newnode->data,Key); newnode->count = 1; pos = Hash(atoi(Key + TELNUM - MAXD),H->Tablesize); newnode->next = H->Heads[pos].next; H->Heads[pos].next = newnode;\ return true; } else { p->count++; return false; } } void print(HashTable H) { PtroToLNode ptr; char Mintel[12]; int maxcnt = 0,Pcnt = 0; Mintel[0] = '\0'; for(int i = 0 ; i < H->Tablesize; i++) { ptr = H->Heads[i].next; while(ptr) { if(ptr->count > maxcnt) { maxcnt = ptr->count; strcpy(Mintel,ptr->data); Pcnt = 1; } else if(ptr->count == maxcnt) { Pcnt++; if (strcmp(Mintel,ptr->data) > 0) { strcpy(Mintel,ptr->data); } } ptr = ptr->next; } } printf("%s %d",Mintel,maxcnt); if(Pcnt > 1)printf(" %d\n",Pcnt); } int main(void) { int N; char Key[12]; scanf("%d",&N); HashTable H = create(N * 2); for(int i = 0; i < N; i++) { scanf("%s",Key);Insert(H,Key); scanf("%s",Key);Insert(H,Key); } print(H); return 0; }