<题目链接>

题目大意:

就是每个字符串有一个配套的对应字符串,询问的时候,无论输出其中的哪一个字符串,输出另一个,如果不存在这个字符串,直接输出"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)的更多相关文章

  1. HDU 1880 魔咒词典 (Hash)

    魔咒词典 Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. hdu 1880 魔咒词典

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1880 魔咒词典 Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有10 ...

  3. HDU 1880 魔咒词典(字符串哈希)

    题目链接 Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一 ...

  4. hdu 1880 魔咒词典 (字符串哈希)

    魔咒词典 Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. hdu 1880 魔咒词典(双hash)

    魔咒词典Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  6. HDU - 1880 魔咒词典~哈希入门

    哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词 ...

  7. HDU-魔咒词典(字符串hash)

    魔咒词典 TimeLimit: 8000/5000 MS (Java/Others)  MemoryLimit: 32768/32768 K (Java/Others) 64-bit integer ...

  8. hdu 1880 魔咒字典

    https://vjudge.net/problem/HDU-1880 题意:略 思路: 一开始就是想到了正确的思路,但是代码写炸了,死活过不了.这题嘛,就是建议一个魔咒与咒语的双向映射.首先用字符串 ...

  9. 魔咒词典 HDU - 1880 (字符串hash 单hash转int或者 双hash )

    哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词 ...

随机推荐

  1. [SCOI2015]小凸想跑步

    题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...

  2. 位运算之——按位与(&)操作——(快速取模算法)

    学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...

  3. 第十八节、基于传统图像处理的目标检测与识别(HOG+SVM附代码)

    其实在深度学习中我们已经介绍了目标检测和目标识别的概念.为了照顾一些没有学过深度学习的童鞋,这里我重新说明一次:目标检测是用来确定图像上某个区域是否有我们要识别的对象,目标识别是用来判断图片上这个对象 ...

  4. (链表) lintcode 219. Insert Node in Sorted Linked List

    Description   Insert a node in a sorted linked list.   Example Example 1: Input: head = 1->4-> ...

  5. Pandas系列(十二)-可视化详解

    目录 1. 折线图 2. 柱状图 3. 直方图 4. 箱线图 5. 区域图 6. 散点图 7. 饼图六边形容器图 数据分析的结果不仅仅只是你来看的,更多的时候是给需求方或者老板来看的,为了更直观地看出 ...

  6. Python字节数组【bytes/bytearray】

    bytes >>> type(b'xxxxx') <class 'bytes'> >>> type('xxxxx') <class 'str'&g ...

  7. SSH框架之hibernate《二》

    Hibernate第二天     一.hibernate的持久化类和对象标识符         1.1持久化类的编写规范             1.1.1什么是持久化类:               ...

  8. EffectiveC++ 第3章 资源管理

    我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 3 资源管理 条款13: 以对象管理资源 有时即使你顺 ...

  9. axios发送post请求,如何提交表单数据?

    axios发送post请求,提交表单数据的方式 默认情况下,axios将JavaScript对象序列化为JSON.要以application / x-www-form-urlencoded格式发送数据 ...

  10. 本地图片上传与H5适配知识

    最近用到本地图片上传作为API的参数,在网上看了许多,记录一下,以后可能用的着(仅自己记录用,看不清请绕路) function getObjectURL(file) { var url = null ...