hdu 1880 魔咒词典
题目连接
http://acm.hdu.edu.cn/showproblem.php?pid=1880
魔咒词典
Description
哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助。
给你一部魔咒词典。当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能;当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒。如果他要的魔咒不在词典中,就输出“what?”
Input
首先列出词典中不超过100000条不同的魔咒词条,每条格式为:
[魔咒] 对应功能
其中“魔咒”和“对应功能”分别为长度不超过20和80的字符串,字符串中保证不包含字符“[”和“]”,且“]”和后面的字符串之间有且仅有一个空格。词典最后一行以“@END@”结束,这一行不属于词典中的词条。
词典之后的一行包含正整数N(<=1000),随后是N个测试用例。每个测试用例占一行,或者给出“[魔咒]”,或者给出“对应功能”。
Output
每个测试用例的输出占一行,输出魔咒对应的功能,或者功能对应的魔咒。如果魔咒不在词典中,就输出“what?”
Sample Input
[expelliarmus] the disarming charm
[rictusempra] send a jet of silver light to hit the enemy
[tarantallegra] control the movement of one's legs
[serpensortia] shoot a snake out of the end of one's wand
[lumos] light the wand
[obliviate] the memory charm
[expecto patronum] send a Patronus to the dementors
[accio] the summoning charm
@END@
4
[lumos]
the summoning charm
[arha]
take me to the sky
Sample Output
light the wand
accio
what?
what?
开始用的mp, mle了然后写了个哈希太挫了 掩面(*/ω╲*)。。
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<map>
using std::abs;
using std::sort;
using std::pair;
using std::swap;
using std::vector;
using std::multimap;
#define pb(e) push_back(e)
#define sz(c) (int)(c).size()
#define mp(a, b) make_pair(a, b)
#define all(c) (c).begin(), (c).end()
#define iter(c) decltype((c).begin())
#define cls(arr, val) memset(arr, val, sizeof(arr))
#define cpresent(c, e) (find(all(c), (e)) != (c).end())
#define rep(i, n) for(int i = 0; i < (int)n; i++)
#define tr(c, i) for(iter(c) i = (c).begin(); i != (c).end(); ++i)
const int N = 100077;
const int INF = 0x3f3f3f3f;
typedef unsigned long long ull;
struct Hash_Set {
struct edge { char str1[22], str2[82]; int next; }G_1[N], G_2[N];
int tot_1, tot_2, head_1[N], head_2[N];
inline void init() {
tot_1 = 0, cls(head_1, -1);
tot_2 = 0, cls(head_2, -1);
}
inline int hash_func(char *s) {
int val = 0;
while (*s != '\0') {
val = ((val << 1) + (*s - 'a')) % N;
s++;
}
return val;
}
inline void insert_1(char *p, char *p1) {
char *s = p;
int val = hash_func(p);
int u = abs(val) % N;
strcpy(G_1[tot_1].str1, p); strcpy(G_1[tot_1].str2, p1);
G_1[tot_1].next = head_1[u], head_1[u] = tot_1++;
}
inline void insert_2(char *p, char *p1) {
char *s = p;
int val = hash_func(p);
int u = abs(val) % N;
strcpy(G_2[tot_2].str2, p); strcpy(G_2[tot_2].str1, p1);
G_2[tot_2].next = head_2[u], head_2[u] = tot_2++;
}
inline char *find_1(char *p) {
char *s = p;
int val = hash_func(p);
int u = abs(val) % N;
for (int i = head_1[u]; ~i; i = G_1[i].next) {
if (!strcmp(G_1[i].str1, p)) return G_1[i].str2;
}
return NULL;
}
inline char *find_2(char *p) {
char *s = p;
int val = hash_func(p);
int u = abs(val) % N;
for (int i = head_2[u]; ~i; i = G_2[i].next) {
if (!strcmp(G_2[i].str2, p)) return G_2[i].str1;
}
return NULL;
}
}hash;
int main() {
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w+", stdout);
#endif
char *p;
int n, k;
char buf[200], str1[100], str2[100];
hash.init();
while (gets(buf)) {
if (!strcmp(buf, "@END@")) break;
cls(str2, 0);
p = strchr(buf, ']');
k = p - buf;
strncpy(str1, buf + 1, k - 1), str1[k - 1] = '\0';
strcpy(str2, p + 2);
hash.insert_1(str1, str2), hash.insert_2(str2, str1);
}
scanf("%d", &n);
getchar();
while (n--) {
gets(buf);
if (buf[0] == '[') {
p = strchr(buf, ']');
k = p - buf;
strncpy(str1, buf + 1, k - 1), str1[k - 1] = '\0';
p = hash.find_1(str1);
puts(!p ? "what?" : p);
} else {
p = hash.find_2(buf);
puts(!p ? "what?" : p);
}
}
return 0;
}
hdu 1880 魔咒词典的更多相关文章
- HDU 1880 魔咒词典(字符串哈希)
题目链接 Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一 ...
- HDU 1880 魔咒词典 (Hash)
魔咒词典 Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 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 Submiss ...
- HDU 1880 魔咒词典 (字符串hash)
<题目链接> 题目大意: 就是每个字符串有一个配套的对应字符串,询问的时候,无论输出其中的哪一个字符串,输出另一个,如果不存在这个字符串,直接输出"what?". 解题 ...
- hdu 1880 魔咒字典
https://vjudge.net/problem/HDU-1880 题意:略 思路: 一开始就是想到了正确的思路,但是代码写炸了,死活过不了.这题嘛,就是建议一个魔咒与咒语的双向映射.首先用字符串 ...
- 魔咒词典(hdu 1880)
Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔 ...
- 魔咒词典 HDU - 1880 (字符串hash 单hash转int或者 双hash )
哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词 ...
随机推荐
- Robotlegs2 学习笔记 -- SwiftSuspenders 2.x (2)
Swiftsuspenders2简介 Swiftsuspenders2是一个基于元数据(metadata)的IOC(控制反转,inversion of control)的AS3的解决方案.(对于元数据 ...
- nginx 配置.json文件直接访问
不要弹出下载 配置nginx.conf http { include mime.types; default_type application/json;
- 实现web页面按比例缩放
对于web的掌握限于可以看懂别人的代码,并在框架中作相应修改或增加. 今天把另一个项目中的网页源代码粘过来做一个页面,结果问题百出. 首先,同样的代码,放在自己的项目里,页面排版错乱,看了下,引用的w ...
- 华为OJ平台——整数的二进制中1的个数
题目描述: 输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 思路: 这是一道很基本的考查位运算的面试题.包括微软在内的很多公司都曾采用 ...
- iPad用户使用Mac和Windows应用软件-记Parallels Access使用体验
iPad用户使用Mac和Windows应用软件-记ParallelsAccess使用体验 用ipad远程连接win系统已不是新鲜事情,我们可以使用TeamViewer和OnLiveDesktopPlu ...
- Windows Phone开发(12):认识一下独具个性的磁贴(转)
对"磁贴"的理解是一点也不抽象的,为什么呢?只要你愿意启动WP系统,无论你是在模拟器中还是在真机中,是的,桌面上那一块块像地板的玩意儿,就是磁贴了.(图:磁贴) 在上图中,我们很直 ...
- 基本的Web控件三
基本的Web控件用法一 ListBox控件 页面布局: <div> <h1>ListBox控件</h1> 学生列表: <br/> <asp:Lis ...
- Web前端代码规范与页面布局
一. 规范目的: 为提高工作效率,便于后台人员添加功能及前端后期优化维护,输出高质量的文档,在网站建设中,使结构更加清晰,代码简明有序,有一个更好的前端架构,有利于SEO优化. 二. ...
- Run JavaScript on your PeopleSoft pages conditionally
Here, PeopleCode sets the logic that determines when the JavaScript code will run. This is not as si ...
- php去除换行(回车换行)的方法
php去除换行(回车换行)的三种方法. 代码: <?php //php 不同系统的换行 //不同系统之间换行的实现是不一样的 //linux 与unix中用 \n //MAC ...