前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PTA 字符串关键字的散列映射(25 分)

PTA 字符串关键字的散列映射(25 分)

作者头像
Kindear
发布2018-03-30 11:26:05
1.5K0
发布2018-03-30 11:26:05
举报
7-17 字符串关键字的散列映射(25 分)

给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位;再用除留余数法将整数映射到长度为P的散列表中。例如将字符串AZDEG插入长度为1009的散列表中,我们首先将26个大写英文字母顺序映射到整数0~25;再通过移位将其映射为3×32​2​​+4×32+6=3206;然后根据表长得到,即是该字符串的散列映射位置。

发生冲突时请用平方探测法解决。

输入格式:

输入第一行首先给出两个正整数N(≤500)和P(≥2N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个字符串关键字,每个长度不超过8位,其间以空格分隔。

输出格式:

在一行内输出每个字符串关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。

输入样例1:

代码语言:javascript
复制
4 11
HELLO ANNK ZOE LOLI

输出样例1:

代码语言:javascript
复制
3 10 4 0

输入样例2:

代码语言:javascript
复制
6 11
LLO ANNA NNK ZOJ INNK AAA

输出样例2:

代码语言:javascript
复制
3 0 10 9 6 1
代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n,cap;
const int maxn = 50100;
int Hashvis[maxn];
int ans[maxn];
set<string> same;
map<string,int> maps;
int GetHash(string t)
{
    int ans = 0;
    for(int i=0;i<min((int)t.length(),3);i++)
    {
        ans+=((int)pow(32,i)*((int)(t[i]-'A')));
    }
    int tans = ans;
    ans%=cap;
    int k = 1;
    while(Hashvis[ans]) //平方探测法
    {
        ans = (tans + k*k)%cap;
        if(!Hashvis[ans]) break;
        ans = (tans - k*k + cap)%cap;
        k++;
    }
    Hashvis[ans] = 1;
    return ans;
}
int main()
{
    memset(ans,0,sizeof(ans));
    memset(Hashvis,0,sizeof(Hashvis));
    scanf("%d%d",&n,&cap);
    string s;
    for(int i=0;i<n;i++)
    {
        cin>>s;
        reverse(s.begin(),s.end());
        if(same.count(s)) ans[i] = maps[s]; //相同判断
        else{
        same.insert(s);
        ans[i] = GetHash(s);
        maps[s] = ans[i];
        }
    }
    for(int i=0;i<n;i++)
        printf("%d%c",ans[i],i==n-1?'\n':' ');
}

代码语言:javascript
复制
代码里有两处需要注意的地方,一个是用set的重复判断,还有平方探测法;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-12-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 7-17 字符串关键字的散列映射(25 分)
  • 输入格式:
  • 输出格式:
  • 输入样例1:
  • 输出样例1:
  • 输入样例2:
  • 输出样例2:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档