D:魔咒词典
题目大意:每一个单词都对应着一个功能,当哈里说出这个魔咒时,你必须可以给出响应的功能,如果没有则输出“what?”
刚开始看到题目,就想到了字典树的方言翻译那个板子题
但是仔细思考了一下,会不会写map更容易
但是写完交完就。。。
[图片]
因为如果字符串很长的话,就会超内存
因次训练的时候就gg了
看了题解后发现hash+二分的方法非常有用
因此就自己写了一遍,确实是有点麻烦
#include<bits/stdc++.h>
using namespace std;
struct node
{
int hash;//记录hash值
int loc;//记录此时的hash值的位置
}code[1000],decode[1000];
int cmp(node a,node b)
{
return a.hash<b.hash;
}
unsigned int get_hash(string s)
{
int t=1;
int base=131;
for(int i=0;i<s.size();i++)
t=t*base+s[i];
}
int main()
{
int num=0;
while(1)
{
cin>>code[num]>>decode[num];
code1[num]=code[num];
decode1[num]=decode[num];
code[num].loc=decode[num].loc=num;
if(strcmp(code1[num],'@END@')==0)
break;
code[num].hash=get_hash(code[num]);
decode[num].hash=get_hash(decode[num]);
num++;
}
sort(code,code+num,cmp);
sort(decode,decode+num,cmp);
int n;
cin>>n;
while(n--)
{
string s;
cin>>s;
node t;
if(s[0]=='[')
{
t.hash=get_hash(s);
int mid=lower_bound(code,code+num,t,cmp)-code;
if(code[mid].hash!=t.hash);
cout<<"What?"<<endl;
else
70 printf("%s\n",decode1[code[mid].l]);
}
else
73 {
74 t.Hash=get_hash(s);
75 int mid=lower_bound(decode,decode+num,t,cmp)-decode;
76 if(decode[mid].Hash!=decode.Hash)
77 printf("what?\n");
78 else
79 {
80 int l=strlen(code1[decode[mid].l]);//处理咒语两边的方括号
81 code1[decode[mid].l][l-1]=0;
82 printf("%s\n",code1[decode[mid].l]+1);
83 }
84 }
}
}