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+mysql+smarty+oop
php+mysql+smarty+oop 设计新闻系统简单的UML模 powerdesigner和diagram designer 设计所需环境.模块.模板样式 数据库uml设计和创建数据库结构 db ...
- HLG1116-选美大赛
Description 一年一度的哈理工选美大赛开始了.来自各个院系的N个美女们都在一起排成一排,然后从左到右给他们标号(1-N),评委叫兽开始观摩,由于身高高低都不同, 叫兽想从中选出尽可能多的人使 ...
- 最新版 CocoaPods 的安装流程
iOS 最新版 CocoaPods 的安装流程 1.移除现有Ruby默认源 $gem sources --remove h ...
- 【BZOJ3282】Tree LCT
1A爽,感觉又对指针重怀信心了呢= =,模板题,注意单点修改时splay就好,其实按吾本意是没写的也A了,不过应该加上能更好维护平衡性. ..还是得加上好= = #include <iostre ...
- Wordpress 所有hoor列表
d 在插件加载的时候执行 wp_footer 加载页面底部时执行 admin_menu 加载管理员菜单时执行 wp_head 在body标签的开始添加html内容 after_setup_theme ...
- php经典算法(转载)
//-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($arr ...
- javascript学习之时间组件
写了一个时间组件,哪里需要哪里调(菜鸟级别,大牛路过就Ok了): 先有一个HTML文件: <!doctype> <html> <head> <title> ...
- 基于spring 的单元测试
需要引用的依赖: import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguratio ...
- Bypass WAF Cookbook
PS.之前一直想把零零碎碎的知识整理下来,作为知识沉淀下来,正好借着wooyun峰会的机会将之前的流程又梳理了一遍,于是就有了下文.也希望整理的内容能给甲方工作者或则白帽子带来一些收获. 0x00 概 ...
- 移动端的传统click事件延迟和点透现象
一.场景描述: 1.A/B两个层上下z轴重叠. 2.上层的A点击后消失或移开.(这一点很重要) 3.B元素本身有默认click事件(如a标签) 或 B绑定了click事件. 在以上情况下,点击A/B重 ...