【PTA】电话聊天狂人 (25 分)

 

//hash函数构造方法:除留余数法Hash()
//冲突解决方法:平方探测法Find()
#include <iostream>
#include <string>
#include <math.h>
using namespace std;

int HashTable_Size;

struct cell
{
    int info;//0表示无效单元,1表示占用
    string data;
};

//找到下一个素数值作为表长
int NextPrime(int N){
    int flag,i;
    for(i=2*N+1;;i+=2){
        flag=1;
        for(int j=3;j<=sqrt(i);j+=2){
            if(i%j==0){
                flag=0;
                break;
            }
        }
        if(flag) break;
    }
    return i;
}

//建立Hash表
cell* CreateHashTable(int N){
    HashTable_Size=NextPrime(N);
    cell* HashTable=new cell[HashTable_Size];

    for(int i=0;i<HashTable_Size;i++){
        HashTable[i].info=0;
        HashTable[i].data="";
    }

    return HashTable;
}

//截取参与散列计算的key
#define KEYLENGTH 11 //关键词长度
#define MAXD 5       //参与散列映射计算的字符个数
int sstoi(string key){
    int res=0;
    for(int i=0;i<MAXD;i++){
        res+=(key[i]-'0')*pow(10,i);
    }
    return res;
}

//计算未发生冲突时的Hash值
//key5:截取后的key
int Hash(int key5){
    key5%=HashTable_Size;
    return key5;
}

//找到最终的合法可插入位置
int Find(string key,cell* HashTable){
    int Cur_pos,New_pos;
    Cur_pos=New_pos=Hash(sstoi(key.substr(KEYLENGTH-MAXD,MAXD)));
    //发生冲突:当非空,且不是要找的元素时
    int Cnum=0;
    while(HashTable[New_pos].info>0 && HashTable[New_pos].data!=key){
        if(++Cnum%2){//奇数次冲突
            New_pos=Cur_pos+(Cnum+1)*(Cnum+1)/4;
            if(New_pos>=HashTable_Size){
                New_pos=New_pos%HashTable_Size;
            }
        }else{//偶数次冲突
            New_pos=Cur_pos-(Cnum*Cnum/4);
             while(New_pos<0){
                New_pos+=HashTable_Size;
            }
        }
    }
    return New_pos;
}

void Insert(string key,cell* HashTable){
    int pos=Find(key,HashTable);
    if(HashTable[pos].info==0){
        HashTable[pos].info=1;
        HashTable[pos].data=key;
    }else{
        HashTable[pos].info++;
    }
}

int main(){
    int N;
    scanf("%d",&N);

    cell* HashTable=CreateHashTable(N);
    cell temp;
    for(int i=0;i<2*N;i++){
        cin>>temp.data;
        Insert(temp.data,HashTable);
    }

    int maxcnt=0,hashid=-1;
    int hcnt=0;
    for(int i=0;i<HashTable_Size;i++){
        if(HashTable[i].info>maxcnt){
            maxcnt=HashTable[i].info;
            hashid=i;
            hcnt=1;
        }else if(HashTable[i].info==maxcnt){
            hcnt++;
            if(HashTable[i].data<HashTable[maxcnt].data){
                hashid=i;
            }
        }
    }
    cout<<HashTable[hashid].data<<" "<<maxcnt;
    if(hcnt>1) cout<<" "<<hcnt;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值