HDU1880 魔咒词典
传送门:HDU1880 魔咒词典
题意
给出多组对应的魔咒和功能,"@END"作为结束。t次询问,每次给出一个魔咒或者功能,打印出对应的功能或者魔咒,若没有,则打印"what?"。
题解
哈希+二分
注
1、map会MLE!
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int mod=1e9+7;
const int base=131;
string s,ans;
struct node{
ll value;
int pos;
}a1[N],a2[N];
string s1[N],s2[N];
int tot=0,t;
ll Hash(string s,int len){
ll ans=0;
for(int i=0;i<len;i++){
ans=(ans*base+s[i])%mod;
}
return ans;
}
bool cmp(node a,node b){
return a.value<b.value;
}
int getpos(node a[],ll x){
int l=1,r=tot;
while(l<=r){
int mid=(l+r)>>1;
if(a[mid].value==x) return a[mid].pos;
else if(a[mid].value<x) l=mid+1;
else r=mid-1;
}
return -1;
}
int main(){
while(getline(cin,s)){
if(s[0]=='@') break;
int l=s.find('[');
int r=s.find(']');
s1[++tot]=s.substr(l+1,r-l-1);
s2[tot]=s.substr(r+2);
int len1=s1[tot].length();
int len2=s2[tot].length();
ll v=Hash(s1[tot],len1);
a1[tot].pos=tot;
a1[tot].value=v;
v=Hash(s2[tot],len2);
a2[tot].pos=tot;
a2[tot].value=v;
}
sort(a1+1,a1+1+tot,cmp);
sort(a2+1,a2+1+tot,cmp);
cin>>t;
getline(cin,s);
for(int i=1;i<=t;i++){
getline(cin,s);
int len=s.length();
if(s[0]=='['){
s=s.substr(1,len-2);
len-=2;
ll now=Hash(s,len);
int idx=getpos(a1,now);
if(idx==-1) ans="what?";
else ans=s2[idx];
}else{
ll now=Hash(s,len);
int idx=getpos(a2,now);
if(idx==-1) ans="what?";
else ans=s1[idx];
}
cout<<ans<<endl;
}
return 0;
}

浙公网安备 33010602011771号