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种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔 ...
随机推荐
- node模块函数图解
已截图方式记录模块信息: HTTP模块: 对于网络返回处理状态封装了很多种,我已截图展现 以上状态也是在http协议中包含的状态. http函数: path模块:
- vs发布的程序不依赖运行时库msvcp100.dll
[摘要:msvcr100.dll:MS Visual C Runtime 100 msvcp100.dll:MS Visual CPp 100 vs建立的工程,运转时库的范例有MD(MDd)战MT ...
- 洛谷 P2733 家的范围 Home on the Range Label:二维数组前缀和
题目背景 农民约翰在一片边长是N (2 <= N <= 250)英里的正方形牧场上放牧他的奶牛.(因为一些原因,他的奶牛只在正方形的牧场上吃草.)遗憾的是,他的奶牛已经毁坏一些土地.( 一 ...
- requirejs:模块加载(require)及定义(define)时的路径小结
原文地址:http://www.tuicool.com/articles/7JBnmy 接触过requirejs的童鞋可能都知道,无论是通过define来定义模块,还是通过require来加载模块,模 ...
- BZOJ1068: [SCOI2007]压缩
... 1068: [SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 909 Solved: 566[Submit][Statu ...
- BZOJ1453: [Wc]Dface双面棋盘
Description Input Output Sample Input Sample Output HINT 线段树套并查集应该是比较好写的做法,时间复杂度为O(N^3+M*NlogN). #in ...
- Query Mobile学习笔记
1.获取jQuery mobile 文件,访问jQuerymobile网站下载 (貌似使用jquery mobile后,jquery会自动在网页中添加一些class类,第一次知道的我是被吓呆的!!) ...
- ZeroMQ接口函数之 :zmq_send_const – 从一个socket上发送一个固定内存数据
ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ——————————————————————————————————— ...
- JavaScript 一种轻量级的编程语言
JavaScript 一种轻量级的编程语言 作为一名计算机应用专业的学生,大一上学期开始接触了网页设计和制作,刚开始时感觉做网页很不错,简单地写几行代码就能做出效果来,当时感觉很兴奋,渐渐的喜欢上它 ...
- javascript函数小练习
求n-m之间数据的和 <script> function num(n,m){ var sum=0; for (var i = n; i <= m; i++) { sum+=i; } ...