字符串关键字的散列映射
7-14 字符串关键字的散列映射 (25 分)
给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位;再用除留余数法将整数映射到长度为P的散列表中。例如将字符串AZDEG
插入长度为1009的散列表中,我们首先将26个大写英文字母顺序映射到整数0~25;再通过移位将其映射为3×322+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]);
}
字符串关键字的散列映射相关推荐
- 7-43 字符串关键字的散列映射 (25 分)(思路+详解+不懂的兄弟们来呀)兄弟们我干了5个小时,一个一个测试点过的
一:题目 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位 ...
- 数据结构PTA 案例5-1.4 字符串关键字的散列映射
案例5-1.4 字符串关键字的散列映射 题目 解法 题目 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位 ...
- 字符串关键字的散列映射 (25 分)【详细解析】
立志用最少的代码做最高效的表达 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射 ...
- PTA字符串关键字的散列映射 (哈希表)
给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射到长度为P的散列表中.例如将字符 ...
- 案例5-1.4 字符串关键字的散列映射 (25分)(数据结构)(C语言实现)
给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射到长度为P的散列表中.例如将字符 ...
- 【数据结构笔记39】哈希表/散列表、(数据关键字/字符串关键字)散列构造函数
本次笔记内容: 11.1.1 引子:散列的基本思路 11.1.2 什么是散列表 11.2.1 数据关键词的散列函数构造 11.2.2 字符串关键词的散列函数构造 文章目录 散列表背景 基本思想引出 已 ...
- 7-42 整型关键字的散列映射 (25 分)(思路加详解)兄弟们 来呀 写题呀
一:题目 给定一系列整型关键字和素数P,用除留余数法定义的散列函数H(Key)=Key将关键字映射到长度为P的散列表中.用线性探测法解决冲突. 输入格式: 输入第一行首先给出两个正整数N(≤1000) ...
- 在线字符串哈希/散列加密工具
在线字符串哈希/散列工具 在线字符串哈希/散列工 本工具可以获取多种散列方式的哈希值,如MD5,SHA1,SHA224,SHA256,SHA384,SHA512,HmacMD5,HmacSHA1等,基 ...
- [LeetCode] Minimum Window Substring 散列映射问题
题目: Given a string S and a string T, find the minimum window in S which will contain all the charact ...
最新文章
- 未来社会是什么样子的?您猜对了吗?
- 深度学习框架TensorFlow(4.Fetch and Feed)
- java中oriqinal_Java集合10 (NavigableMap)
- 基站位置查询系统_木牛导航网络基站服务免费了!——更便捷、更高效、更省心!...
- gb酱油和gbt酱油哪个好_都是酱油,生抽好还是味极鲜好?老板:两者差别很大,别买错了...
- 2015-2020年各类国际会议与期刊基于图像的三维对象重建论文综述(3)——Volumetric decoding
- python 修改pdf内容,如何使用python更改pdf内的超链接?
- 密码学笔记—栅栏密码
- FillRect、FrameRect、Rectangle 矩形绘制函数使用对比分析
- 小丁带你走进git世界一-git简单配置
- 60分钟吃掉嘎嘣脆的DeepCross模型
- 计算机派位志愿填报技巧,小升初电脑大派位:大派位操作流程及志愿填报
- 15、TWS API和IB中的期权相关的操作
- 全国中学生计算机大赛+试题,全国青少年信息学奥林匹克竞赛(NOI2018)正式开幕(附day1试题)...
- 小程序 键盘挡住底部输入框解析
- git拉取和提交代码
- Linux:python数据库(mysql),多线程以及套接子(socket)
- Android 4权威专家撰写,经典作品最新升级版(内附部分章节试读下载地址)
- 中国人民公安大学网络对抗技术实验四
- 有多少人戴着黑帽子?
热门文章
- python123身份证号掩盖出生日期_身份证号转变为出生日期
- matlab字符模板在哪,新人求助!车牌识别系统里的字符模版存放路径是哪里
- React实现(Web端)网易云音乐项目(二),错过了真的可惜呀
- Activity到底是什么(新手学Android)
- 龙贝格算法在MATLAB的实现
- 如何利用计算机班级成绩分析,北京自考计算机应用基础课成绩分析报告
- 拿了“普通女生”的人生剧本,可以不普通吗?
- 热风枪的温度设置(与焊锡有无含铅有关)和使用注意
- [python] fileinput模块
- u盘数据恢复软件mac版下载与应用