魔咒词典 HDU - 1880
感觉这题巨毒瘤,读入字符串方面调了好久才避免了读入空白字符。
思路就是对每条信息的魔咒和功能的记录在S1和S2串里,并在ihash数组里通过信息的编号(cnt)确定存放的列,将魔咒(魔咒的hash值存在第一行)或功能(功能的hash值存在第2行)的hash值存入。然后输入一个要查找的字符串,就先求出其hash值,然后在去ihash数组里找。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<fstream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
#define ull unsigned long long
ull ihash[3][100005],base=1331;
char s1[100005][25],s2[100005][85];
int cnt;
ull myhash(char*p)
{
ull ans=0;
for(;*p!=0;p++)
ans=ans*base+*p;
return ans;
}
int main()
{
cnt=1;
while(1)
{
scanf(" %s",s1[cnt]);
if(s1[cnt][0]=='@')
break;
int len=strlen(s1[cnt]);
s1[cnt][len-1]=0;
ihash[1][cnt]=myhash(s1[cnt]+1);
//cout<<"1:"<<s1[cnt]+1<<endl;
getchar();
gets(s2[cnt]+1);
//cout<<"1:"<<s2[cnt]+1<<endl;
ihash[2][cnt]=myhash(s2[cnt]+1);
cnt++;
}
// cout<<cnt-1<<endl;
//for(int i=1;i<=cnt-1;i++)
//{
// cout<<i<<" "<<s1[i]+1<<" funtion: "<<s2[i]+1<<" /对应hash值"<<ihash[1][i]<<" "<<ihash[2][i]<<endl;
// }
int q;
cin>>q;
getchar();
char s[100];
while(q--)
{
gets(s);
// cout<<s<<endl;
if(s[0]=='[')
{
int len=strlen(s);
s[len-1]=0;
ull mb=myhash(s+1);
// cout<<"/读入的字符串:"<<endl;
//cout<<"/询问字符串的hash值"<<mb<<endl;
int flag=0,ans;
for(int i=1;i<=cnt-1;i++)
{
if(ihash[1][i]==mb)
{
flag=1;
ans=i;
break;
}
}
if(flag)
{
cout<<s2[ans]+1<<endl;
}
else
cout<<"what?"<<endl;
}
else
{
ull mb=myhash(s);
//cout<<"/询问字符串的hash值"<<mb<<endl;
int flag=0,ans;
for(int i=1;i<=cnt-1;i++)
{
if(ihash[2][i]==mb)
{
flag=1;
ans=i;
break;
}
}
if(flag)
{
cout<<s1[ans]+1<<endl;
}
else
cout<<"what?"<<endl;
}
}
return 0;
}