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种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词 ...
随机推荐
- (转)Java8内存模型—永久代(PermGen)和元空间(Metaspace)
背景:介绍java8中永久代到元空间的转变. Java8内存模型—永久代(PermGen)和元空间(Metaspace) 一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法 ...
- PHP基础之$_SERVER的详细参数与说明
这几天准备静下心来看看平时忽略的一些PHP基础知识,也算是一个复习吧. 今天准备复习的是$_SERVER这个变量. 说明:$_SERVER 是一个包含了诸如头信息(header).路径(path).以 ...
- P2518 [HAOI2010]计数
题目链接 \(Click\) \(Here\) 很好很妙的一个题目. 其实可以生成的数字,一定是原数的一个排列,因为\(0\)被放在前面就可以认为不存在了嘛~.也就是说现在求的就是全排列中所有小于该数 ...
- mac开发环境搭建篇(2)--brew与mysql
[brew]:参考 https://www.cnblogs.com/zoulifeng2017/p/7514139.html 安装brew: 终端执行:/usr/bin/ruby -e "$ ...
- HTML词法和语法
1. 词 token 专业不是计算机的博主比较尴尬,一直以为token就是验证身份用的标识 token —— 表示 “最小有意义的单元” 以这个简单的p标签为例,我们分析哪些是token: <p ...
- Numpy 系列(七)- 常用函数
在了解了 Numpy 的基本运算操作,下面来看下 Numpy常用的函数. 数学运算函数 add(x1,x2 [,out]) 按元素添加参数,等效于 x1 + x2 subtract(x1,x2 ...
- kubernetes云平台管理实战: 集群部署(一)
一.环境规划 1.架构拓扑图 2.主机规划 3.软件版本 [root@k8s-master ~]# cat /etc/redhat-release CentOS Linux release 7.4.1 ...
- tex 进度条
\documentclass{beamer} \usepackage{tikz} \usetikzlibrary{calc} \definecolor{pbblue}{HTML}{0A75A8}% f ...
- 使用 Google
非原版 Glgoo:http://www.glgoo.com/谷粉搜搜:http://www.gfsoso.net/谷粉搜搜:http://www.gfsswy.com/谷粉搜搜:http://guf ...
- 使用echarts-for-react 绘制折线图 报错:`series.type should be specified `
解决办法: 在动态获取值的函数前面加 访问器属性 get ,去获取对象的属性 @inject('commonStore', 'reportUIStore') @observer class Line ...