HDU 1880 魔咒词典 (字符串hash)
<题目链接>
题目大意:
就是每个字符串有一个配套的对应字符串,询问的时候,无论输出其中的哪一个字符串,输出另一个,如果不存在这个字符串,直接输出"what?"。
解题分析: 转载于 >>>
本题很明显要用字符串hash,数据量比较大,如果直接用map,会Mle。所以我们用hash表来处理,下面采用了一个比较优秀的hash算法-BKDR进行处理。
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int MAXN = 2e6 + ;
const int MOD = 1e6 + ;
const int BASE = ; struct Node{
char s[];
Node* next;
}Hashpos[MAXN], *head[MOD], *now; //BKDRHash算法是字符串hash算法。是一种比较优秀的hash算法
int Get_Id(char *s){ //得到字符串hash后的hash值
int Hash = ;
int len = strlen(s);
for(int i = ; i < len ; i++)
Hash = (Hash * BASE % MOD + s[i]) % MOD ;
return Hash;
}
void BKDRHashpos(char *s){
int code = Get_Id(s);
Node* p = head[code];//取的是地址(以该code为头标志的最后一个数的地址)
while(p){ //如果没有到达头标志一直往上
if(!strcmp(p->s, s)) //如果hash地址相同的链表上有这个元素,直接返回
return;
else p = p->next; //如果没有这个元素,就一直向后查找,直至放在链表的尾部
}
strcpy(now->s, s); //将这个元素插入当前位置(最后一个位置)
now->next = head[code]; //记录这个数上一个的地址,就是与链式前向星的作用类似
head[code] = now++; //更新这个code所对应的最后一个数的地址
}
int find(char *s){
int code = Get_Id(s);
Node* p = head[code];
while(p){
if(!strcmp(p->s, s))return p-Hashpos; //p为当前串在哈希表上的地址,Hashpos是初始地址
else p = p->next;
}
return -;
}
int main(){
now = Hashpos;
char str[];
while(~scanf("%s", str)){
if(!strcmp(str,"@END@"))break;
getchar();
BKDRHashpos(str);
gets(str);BKDRHashpos(str);
}
int q;scanf("%d",&q);getchar();
while(q--){
gets(str);
int id = find(str);
if(id==-) puts("what?");
else{
char *node = Hashpos[id^].s; //因为是从0开始 两两 存储,所以这里直接取异或
if(node[]=='['){
for(int i=;node[i]!=']';i++)
printf("%c",node[i]);
puts("");
}
else puts(node);
}
}
}
HDU 1880 魔咒词典 (字符串hash)的更多相关文章
- HDU 1880 魔咒词典 (Hash)
魔咒词典 Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 1880 魔咒词典
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1880 魔咒词典 Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有10 ...
- HDU 1880 魔咒词典(字符串哈希)
题目链接 Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一 ...
- hdu 1880 魔咒词典 (字符串哈希)
魔咒词典 Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 1880 魔咒词典(双hash)
魔咒词典Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU - 1880 魔咒词典~哈希入门
哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词 ...
- HDU-魔咒词典(字符串hash)
魔咒词典 TimeLimit: 8000/5000 MS (Java/Others) MemoryLimit: 32768/32768 K (Java/Others) 64-bit integer ...
- hdu 1880 魔咒字典
https://vjudge.net/problem/HDU-1880 题意:略 思路: 一开始就是想到了正确的思路,但是代码写炸了,死活过不了.这题嘛,就是建议一个魔咒与咒语的双向映射.首先用字符串 ...
- 魔咒词典 HDU - 1880 (字符串hash 单hash转int或者 双hash )
哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词 ...
随机推荐
- [SCOI2015]小凸想跑步
题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...
- 位运算之——按位与(&)操作——(快速取模算法)
学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...
- 第十八节、基于传统图像处理的目标检测与识别(HOG+SVM附代码)
其实在深度学习中我们已经介绍了目标检测和目标识别的概念.为了照顾一些没有学过深度学习的童鞋,这里我重新说明一次:目标检测是用来确定图像上某个区域是否有我们要识别的对象,目标识别是用来判断图片上这个对象 ...
- (链表) lintcode 219. Insert Node in Sorted Linked List
Description Insert a node in a sorted linked list. Example Example 1: Input: head = 1->4-> ...
- Pandas系列(十二)-可视化详解
目录 1. 折线图 2. 柱状图 3. 直方图 4. 箱线图 5. 区域图 6. 散点图 7. 饼图六边形容器图 数据分析的结果不仅仅只是你来看的,更多的时候是给需求方或者老板来看的,为了更直观地看出 ...
- Python字节数组【bytes/bytearray】
bytes >>> type(b'xxxxx') <class 'bytes'> >>> type('xxxxx') <class 'str'&g ...
- SSH框架之hibernate《二》
Hibernate第二天 一.hibernate的持久化类和对象标识符 1.1持久化类的编写规范 1.1.1什么是持久化类: ...
- EffectiveC++ 第3章 资源管理
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 3 资源管理 条款13: 以对象管理资源 有时即使你顺 ...
- axios发送post请求,如何提交表单数据?
axios发送post请求,提交表单数据的方式 默认情况下,axios将JavaScript对象序列化为JSON.要以application / x-www-form-urlencoded格式发送数据 ...
- 本地图片上传与H5适配知识
最近用到本地图片上传作为API的参数,在网上看了许多,记录一下,以后可能用的着(仅自己记录用,看不清请绕路) function getObjectURL(file) { var url = null ...