<题目链接>

题目大意:

就是每个字符串有一个配套的对应字符串,询问的时候,无论输出其中的哪一个字符串,输出另一个,如果不存在这个字符串,直接输出"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. AWS设置允许root登陆

    Refer to the following to set root login: sudo -s (to become root) vi /root/.ssh/authorized_keys Del ...

  2. nginx的location配置root、alias用法和区别

    root & alias区别root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上root的处理结果是:root路径 ...

  3. SQL Server 2008还原数据库时出现“备份集中的数据库备份与现有的数据库不同”的解决方法

    引言 现在在做项目,由于每个人是分模块的,所以大家的测试数据都不同步,导致好多时候会因为别人填的数据不同而调半天的错.所以我还是自己还原一个数据库,自己填自己的数据吧. 报错 之前还原过很多个数据库都 ...

  4. Docker的可视化管理工具对比

    Docker的可视化管理工具有DockerUI.Shipyard.Rancher.Portainer等等,这里主要对这几个进行优劣对比. DockerUI: 优点   (1)支持container批量 ...

  5. HZNU第十二届校赛赛后补题

    愉快的校赛翻皮水! 题解 A 温暖的签到,注意用gets #include <map> #include <set> #include <ctime> #inclu ...

  6. [物理学与PDEs]第2章习题2 质量力有势时的能量方程

    试证明: 如果质量力有势, 即存在 $\phi$ 使 ${\bf F}=-\n \phi$, 那么理想流体的能量守恒方程的微分形式可写为 $$\bex \cfrac{\rd}{\rd t}\sex{e ...

  7. Kaldi nnet3的前向计算

    根据任务,构建ComputationRequst 编译ComputationRequst,获取NnetComputation std::shared_ptr<const NnetComputat ...

  8. html 超链接标签 锚点 a标签伪类

    一个简易的连接 <a href="01.html">01</a> <body> <a href="01.html" t ...

  9. hiho 1098 最小生成树二·Kruscal算法 (最小生成树)

    题目: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的分析, ...

  10. RabbitMQ环境搭建

    消息 RabbitMQ  1.安装erlang环境 2.安装rabbitmq 3.参考资料 AMQP协议,可以跨语言通信 Advance Message Queuing Protocol Rabbit ...