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

时间:2022-09-14 11:14:21

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:

4 11
HELLO ANNK ZOE LOLI

输出样例1:

3 10 4 0

输入样例2:

6 11
LLO ANNA NNK ZOJ INNK AAA

输出样例2:

3 0 10 9 6 1
#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':' ');
}

  


代码里有两处需要注意的地方,一个是用set的重复判断,还有平方探测法;

PTA 字符串关键字的散列映射(25 分)的更多相关文章

  1. PTA数据结构与算法题目集&lpar;中文&rpar; 7-43字符串关键字的散列映射 &lpar;25 分&rpar;

    PTA数据结构与算法题目集(中文)  7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分)   给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...

  2. PTA数据结构与算法题目集&lpar;中文&rpar; 7-42整型关键字的散列映射 &lpar;25 分&rpar;

    PTA数据结构与算法题目集(中文)  7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分)   给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...

  3. PTA 7-42 整型关键字的散列映射(手写哈希表的线性探测法)

    本题考点: 整型哈希表的线性探测法 给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中.用线性探测法解决冲突. 输入格式: 输入第一行首先给出两个正整数N(≤10 ...

  4. java 散列与散列码探讨 &comma;简单HashMap实现散列映射表运行各种操作示列

    java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列 package org.rui.collection2.maps; /** * 散列与散列码 * 将土拔鼠对象与预报对象 ...

  5. &lbrack;19&sol;03&sol;26-星期二&rsqb; 容器&lowbar;Map&lpar;图、键值对、映射&rpar;接口之HashMap&lpar;散列映射&rpar;&amp&semi;TreeMap&lpar;树映射&rpar;

    一.概念&方法 现实生活中,我们经常需要成对存储某些信息.比如,我们使用的微信,一个手机号只能对应一个微信账户,这就是一种成对存储的关系. Map就是用来存储“键(key)-值(value) ...

  6. PTA 09-排序2 Insert or Merge &lpar;25分&rpar;

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/675 5-13 Insert or Merge   (25分) According to ...

  7. PTA 08-图8 How Long Does It Take &lpar;25分&rpar;

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/674 5-12 How Long Does It Take   (25分) Given ...

  8. PTA 02-线性结构4 Pop Sequence &lpar;25分&rpar;

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/665 5-3 Pop Sequence   (25分) Given a stack wh ...

  9. &lpar;数学&rpar; PTA 1005 继续&lpar;3n&plus;1&rpar;猜想 (25 分&rpar;

    1005 继续(3n+1)猜想 (25 分) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程 ...

随机推荐

  1. DOM扩展-Selectors API&lpar;选择符 API&rpar;、元素遍历

    DOM扩展 对DOM的两个主要扩展是SelectorsAPI(选择符API)和HTML5 SelectorsAPI(选择符API)是由W3C发起制定的一个标准,致力于浏览器原生支持CSS查询,Sele ...

  2. 高性能Linux服务器构建实战笔记

    一.            web应用篇 1           HTTP服务器Nginx 1.1          性能上.功能上.安装上与Apache对比 l  性能上占用系统资源少,支持并发高 ...

  3. 关于Servlet手动配置web&period;xml部分代码

    <servlet> <!-- 文件名 --> <servlet-name>deleteServlet</servlet-name> <!-- 文件 ...

  4. &lbrack;译&rsqb;ASP&period;NET 5&colon; New configuration files and containers

    原文:http://gunnarpeipman.com/2014/11/asp-net-5-new-configuration-files-and-containers/ ASP.NET vNext提 ...

  5. &lbrack;转&rsqb;大型 JavaScript 应用架构中的模式

    目录 1.我是谁,以及我为什么写这个主题 2.可以用140个字概述这篇文章吗? 3.究竟什么是“大型”JavaScript应用程序? 4.让我们回顾一下当前的架构 5.想得长远一些 6.头脑风暴 7. ...

  6. odata

    http://www.odata.org/ Open Data Protocol (开放数据协议,OData)是用来查询和更新数据的一种Web协议,其提供了把存在于应用程序中的数据暴露出来的方式.OD ...

  7. 例题6-8 Tree Uva548

    这道题我一直尝试用scanf来进行输入,不过一直没有成功,因此先搁置一下,以后积累些知识再进行尝试. 这道题有两种解决方案: 即先建树,再遍历和边建树边遍历.这两种方案经过实践证实效率相差不太多.应该 ...

  8. SnappyDB—Android上的NoSQL数据库简介

    参考:http://www.open-open.com/lib/view/open1420816891937.html 参考:http://android-arsenal.com/details/1/ ...

  9. 【转】【JAVA应用】多线程断点下载

    [转自] 光仔December http://blog.csdn.net/acmman 问题:多线程下载的好处? 多线程下载比单线程下载快,主要的原因是采用多线程下载,可以抢占更多的服务器资源.抢占C ...

  10. Docker多台物理主机之间的容器互联

    Docker 默认的桥接网卡是 docker0.它只会在本机桥接所有的容器网卡,举例来说容器的虚拟网卡在主机上看一般叫做 veth* 而 Docker 只是把所有这些网卡桥接在一起,如下: [root ...