7-14 字符串关键字的散列映射 (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;
set<int> s;
map<string,int > m;
int main()
{s.clear();int flag=1;int n,p;cin>>n>>p;for(int j=0; j<n; j++){string ss;cin>>ss;if(m.count(ss)){cout<<' '<<m[ss];continue;}int has;if(ss.size()>=3)has=ss[ss.size()-1]-'A'+(ss[ss.size()-2]-'A')*32+(ss[ss.size()-3]-'A')*32*32;else if(ss.size()==2){has=ss[ss.size()-1]-'A'+(ss[ss.size()-2]-'A')*32;}else if(ss.size()==1){has=ss[0]-'A';}else has = 0;// cout<<has<<endl;has=has%p;if(s.count(has)==0){if(flag){cout<<has;flag=0;}elsecout<<' '<<has;m[ss]=has;s.insert(has);}else{for(int i=1;; i++){int has1;if(has+i*i>=p)has1=(has+i*i)%p;elsehas1=has+i*i;if(s.count(has1)==0){cout<<' '<<has1;s.insert(has1);m[ss]=has1;break;}int has2;if(has-i*i<0)has2=(has-i*i)%p+p;elsehas2=(has-i*i)%p;if(s.count(has2)==0){cout<<' '<<has2;s.insert(has2);m[ss]=has2;break;}}}}return 0;
}

法二:某学长的

#include <bits/stdc++.h>
using namespace std;
int vis[2000];
int res[510];
char str[2000][9];
int Transform(char key[])
{int val, a, b, c, len = strlen(key);a = b = c = 0;if(len >= 1)a = key[len - 1] - 'A';if(len >= 2)b = key[len - 2] - 'A';if(len >= 3)c = key[len - 3] - 'A';val = a + b * 32 + c * 32 * 32;return val;
}
int GetPt(char key[9], int p)
{int hashval = Transform(key) % p;if(vis[hashval] == 0 || strcmp(str[hashval], key) == 0){vis[hashval] = 1;strcpy(str[hashval], key);}else{for(int i = 1; ; i++){if(hashval + i * i < p){if(vis[hashval + i * i] == 0 || strcmp(str[hashval + i * i], key) == 0){vis[hashval + i * i] = 1;hashval += i * i;strcpy(str[hashval], key);break;}}else{int temp = (hashval + i * i) % p;if(vis[temp] == 0 || strcmp(str[temp], key) == 0){vis[temp] = 1;hashval = temp;strcpy(str[hashval], key);break;}}if(hashval - i * i >= 0){if(vis[hashval - i * i] == 0 || strcmp(str[hashval - i * i], key) == 0){vis[hashval - i * i] = 1;hashval -= i * i;strcpy(str[hashval], key);break;}}else{int temp = (hashval - i * i) % p + p;if(vis[temp] == 0 || strcmp(str[temp], key) == 0){vis[temp] = 1;hashval = temp;strcpy(str[hashval], key);break;}}}}return hashval;
}
int main()
{int N, P, val;char key[9];scanf("%d %d", &N, &P);for(int i = 0; i < P; ++i)vis[i] = 0;for(int i = 1; i <= N; ++i){if(i != 1)getchar();scanf("%s", key);res[i] = GetPt(key, P);}if(N > 0)printf("%d", res[1]);for(int i = 2; i <= N; ++i)printf(" %d", res[i]);
}

字符串关键字的散列映射相关推荐

  1. 7-43 字符串关键字的散列映射 (25 分)(思路+详解+不懂的兄弟们来呀)兄弟们我干了5个小时,一个一个测试点过的

    一:题目 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位 ...

  2. 数据结构PTA 案例5-1.4 字符串关键字的散列映射

    案例5-1.4 字符串关键字的散列映射 题目 解法 题目 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位 ...

  3. 字符串关键字的散列映射 (25 分)【详细解析】

    立志用最少的代码做最高效的表达 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射 ...

  4. PTA字符串关键字的散列映射 (哈希表)

    给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射到长度为P的散列表中.例如将字符 ...

  5. 案例5-1.4 字符串关键字的散列映射 (25分)(数据结构)(C语言实现)

    给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射到长度为P的散列表中.例如将字符 ...

  6. 【数据结构笔记39】哈希表/散列表、(数据关键字/字符串关键字)散列构造函数

    本次笔记内容: 11.1.1 引子:散列的基本思路 11.1.2 什么是散列表 11.2.1 数据关键词的散列函数构造 11.2.2 字符串关键词的散列函数构造 文章目录 散列表背景 基本思想引出 已 ...

  7. 7-42 整型关键字的散列映射 (25 分)(思路加详解)兄弟们 来呀 写题呀

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

  8. 在线字符串哈希/散列加密工具

    在线字符串哈希/散列工具 在线字符串哈希/散列工 本工具可以获取多种散列方式的哈希值,如MD5,SHA1,SHA224,SHA256,SHA384,SHA512,HmacMD5,HmacSHA1等,基 ...

  9. [LeetCode] Minimum Window Substring 散列映射问题

    题目: Given a string S and a string T, find the minimum window in S which will contain all the charact ...

最新文章

  1. 未来社会是什么样子的?您猜对了吗?
  2. 深度学习框架TensorFlow(4.Fetch and Feed)
  3. java中oriqinal_Java集合10 (NavigableMap)
  4. 基站位置查询系统_木牛导航网络基站服务免费了!——更便捷、更高效、更省心!...
  5. gb酱油和gbt酱油哪个好_都是酱油,生抽好还是味极鲜好?老板:两者差别很大,别买错了...
  6. 2015-2020年各类国际会议与期刊基于图像的三维对象重建论文综述(3)——Volumetric decoding
  7. python 修改pdf内容,如何使用python更改pdf内的超链接?
  8. 密码学笔记—栅栏密码
  9. FillRect、FrameRect、Rectangle 矩形绘制函数使用对比分析
  10. 小丁带你走进git世界一-git简单配置
  11. 60分钟吃掉嘎嘣脆的DeepCross模型
  12. 计算机派位志愿填报技巧,小升初电脑大派位:大派位操作流程及志愿填报
  13. 15、TWS API和IB中的期权相关的操作
  14. 全国中学生计算机大赛+试题,全国青少年信息学奥林匹克竞赛(NOI2018)正式开幕(附day1试题)...
  15. 小程序 键盘挡住底部输入框解析
  16. git拉取和提交代码
  17. Linux:python数据库(mysql),多线程以及套接子(socket)
  18. Android 4权威专家撰写,经典作品最新升级版(内附部分章节试读下载地址)
  19. 中国人民公安大学网络对抗技术实验四
  20. 有多少人戴着黑帽子?

热门文章

  1. python123身份证号掩盖出生日期_身份证号转变为出生日期
  2. matlab字符模板在哪,新人求助!车牌识别系统里的字符模版存放路径是哪里
  3. React实现(Web端)网易云音乐项目(二),错过了真的可惜呀
  4. Activity到底是什么(新手学Android)
  5. 龙贝格算法在MATLAB的实现
  6. 如何利用计算机班级成绩分析,北京自考计算机应用基础课成绩分析报告
  7. 拿了“普通女生”的人生剧本,可以不普通吗?
  8. 热风枪的温度设置(与焊锡有无含铅有关)和使用注意
  9. [python] fileinput模块
  10. u盘数据恢复软件mac版下载与应用