HDU 1880 魔咒词典(字符串哈希)
Problem Description
哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助。
给你一部魔咒词典。当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能;当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒。如果他要的魔咒不在词典中,就输出“what?”
Input
首先列出词典中不超过100000条不同的魔咒词条,每条格式为:
[魔咒] 对应功能
其中“魔咒”和“对应功能”分别为长度不超过20和80的字符串,字符串中保证不包含字符“[”和“]”,且“]”和后面的字符串之间有且仅有一个空格。词典最后一行以“@END@”结束,这一行不属于词典中的词条。
词典之后的一行包含正整数N(<=1000),随后是N个测试用例。每个测试用例占一行,或者给出“[魔咒]”,或者给出“对应功能”。
Output
每个测试用例的输出占一行,输出魔咒对应的功能,或者功能对应的魔咒。如果魔咒不在词典中,就输出“what?”
题目大意:略。
思路:字符串哈希。
PS:由于这个题目的所有字符串存起来已经有20+MB,对于这个只有32MB内存限制的题目,用map< stirng, string > 只会MLE,于是只能手写hash。
PS2:主要是为了测试一下pb_ds里的hash。使用方法可以参考WC2015的论文《C++的pb_ds库在OI中的应用》。
- std::map版本(421MS 31536KB)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
typedef long long LL;
const int MAXN = 108;
std::map<int, int> dict_forward, dict_backward;
std::string a[100000], b[100000];
char str1[MAXN], str2[MAXN];
std::string tmp1, tmp2;
int n;
int gethash(const std::string &str) {
LL res = 0;
for(char c : str)
res = (res * 131 + c) % 1000000007;
return res;
}
void myfind(const std::string &s, std::map<int, int> &dict, std::string arr[]) {
auto it = dict.find(gethash(s));
if(it != dict.end()) {
std::cout<<arr[it->second]<<std::endl;
} else {
puts("what?");
}
}
int main() {
int cnt = 0;
while(gets(str1) && strcmp(str1, "@END@") != 0) {
int pos = strchr(str1, ']') - str1;
a[cnt] = std::string(str1 + 1, pos - 1);
b[cnt] = std::string(str1 + pos + 2);
dict_forward[gethash(a[cnt])] = cnt;
dict_backward[gethash(b[cnt])] = cnt;
cnt++;
}
scanf("%d", &n); getchar();
for(int i = 0; i < n; ++i) {
gets(str1);
if(*str1 == '[') {
tmp1 = std::string(str1 + 1, strlen(str1) - 2);
myfind(tmp1, dict_forward, b);
} else {
myfind(str1, dict_backward, a);
}
}
}
- cc_hash_table(265MS 32736KB)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
typedef long long LL;
const int MAXN = 108;
__gnu_pbds::cc_hash_table<int, int> dict_forward, dict_backward;
std::string a[100000], b[100000];
char str[MAXN];
std::string tmp1, tmp2;
int n;
int gethash(const std::string &str) {
LL res = 0;
for(char c : str)
res = (res * 131 + c) % 1000000007;
return res;
}
void myfind(const std::string &s, __gnu_pbds::cc_hash_table<int, int> &dict, std::string arr[]) {
auto it = dict.find(gethash(s));
if(it != dict.end()) {
std::cout<<arr[it->second]<<std::endl;
} else {
puts("what?");
}
}
int main() {
int cnt = 0;
while(gets(str) && strcmp(str, "@END@") != 0) {
int pos = strchr(str, ']') - str;
a[cnt] = std::string(str + 1, pos - 1);
b[cnt] = std::string(str + pos + 2);
dict_forward[gethash(a[cnt])] = cnt;
dict_backward[gethash(b[cnt])] = cnt;
cnt++;
}
scanf("%d", &n); getchar();
for(int i = 0; i < n; ++i) {
gets(str);
if(*str == '[') {
tmp1 = std::string(str + 1, strlen(str) - 2);
myfind(tmp1, dict_forward, b);
} else {
myfind(str, dict_backward, a);
}
}
}
- gp_hash_table(374MS 31216KB)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
typedef long long LL;
const int MAXN = 108;
__gnu_pbds::gp_hash_table<int, int> dict_forward, dict_backward;
std::string a[100000], b[100000];
char str[MAXN];
std::string tmp1, tmp2;
int n;
int gethash(const std::string &str) {
LL res = 0;
for(char c : str)
res = (res * 131 + c) % 1000000007;
return res;
}
void myfind(const std::string &s, __gnu_pbds::gp_hash_table<int, int> &dict, std::string arr[]) {
auto it = dict.find(gethash(s));
if(it != dict.end()) {
std::cout<<arr[it->second]<<std::endl;
} else {
puts("what?");
}
}
int main() {
int cnt = 0;
while(gets(str) && strcmp(str, "@END@") != 0) {
int pos = strchr(str, ']') - str;
a[cnt] = std::string(str + 1, pos - 1);
b[cnt] = std::string(str + pos + 2);
dict_forward[gethash(a[cnt])] = cnt;
dict_backward[gethash(b[cnt])] = cnt;
cnt++;
}
scanf("%d", &n); getchar();
for(int i = 0; i < n; ++i) {
gets(str);
if(*str == '[') {
tmp1 = std::string(str + 1, strlen(str) - 2);
myfind(tmp1, dict_forward, b);
} else {
myfind(str, dict_backward, a);
}
}
}
HDU 1880 魔咒词典(字符串哈希)的更多相关文章
- HDU 1880 魔咒词典 (字符串hash)
<题目链接> 题目大意: 就是每个字符串有一个配套的对应字符串,询问的时候,无论输出其中的哪一个字符串,输出另一个,如果不存在这个字符串,直接输出"what?". 解题 ...
- hdu 1880 魔咒词典
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1880 魔咒词典 Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有10 ...
- hdu 1880 魔咒词典 (字符串哈希)
魔咒词典 Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU - 1880 魔咒词典~哈希入门
哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词 ...
- HDU 1880 魔咒词典 (Hash)
魔咒词典 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 魔咒字典
https://vjudge.net/problem/HDU-1880 题意:略 思路: 一开始就是想到了正确的思路,但是代码写炸了,死活过不了.这题嘛,就是建议一个魔咒与咒语的双向映射.首先用字符串 ...
- 魔咒词典 HDU - 1880 (字符串hash 单hash转int或者 双hash )
哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词 ...
- 魔咒词典(hdu 1880)
Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔 ...
随机推荐
- 开篇一文 php 和 js 默认参数
啥话不说... <?php function setheight($height=50){ echo "这个高度是 $height <br />"; } seth ...
- 2016最新 wamp2.5+windows 10安装CoedSgniffer代码格式检查:
14:59 2016/1/112016最新 wamp2.5+windows 10安装CoedSgniffer代码格式检查:注意问题:1.手动安装2.5.0和pear安装方式都成功但是执行时无任何反映, ...
- C#_实用
1.获取当前浏览器信息HttpContext.Current.Request.Browser string browser = HttpContext.Current.Request.Browser. ...
- Python之路第一课Day3--随堂笔记(文件操作)
一.集合的介绍 1.集合操作 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 常用操作 s = se ...
- JS开发HTML5游戏《神奇的六边形》(一)
近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...
- java并发编程(六)Runnable和Thread实现多线程的区别
http://blog.csdn.net/ns_code/article/details/17161237
- struts-json-plugin result中配置对象的序列化
注意: 在使用strtus-json-plugin序列化对象属性,配置result标签下includeProperties属性时使用 对象名.*或则指定属性名的方式,不能光写对象属性名. 问题: ac ...
- 10款最新流行的 jQuery 插件,值得你收藏
10款最新流行的 jQuery 插件,值得你收藏 http://www.cnblogs.com/lhb25/p/10-new-popular-jquery-plugins-check.html 你应该 ...
- 总结-mysql
执行sql脚本: source C:/users/liaolongjun/Desktop/miduo_fileinfo.sql; 注意,必须是正斜杆.如果是反斜杆,也会执行,但会报错. 导入数据: L ...
- 修改SQL SERVER表,并添加说明
alter table dbo.user_PersonManagement add F_FGBM nvarchar(500)GO EXEC sys.sp_addextendedproperty @na ...