Fork me on GitHub

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;
} 
posted @ 2020-03-14 15:33  qjy_73  阅读(119)  评论(0)    收藏  举报