直接哈希就好了。map也能过,注意处理输入。
这题很坑啊,一直runtime error..
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1e5+5;
const int hash_base=100001;
int hash_table[maxn];
struct node{
char s1[11],s2[11];
int next;
}val[maxn];
int cur=0;
int ELFhash(char key[]){
unsigned long h = 0;
unsigned long x = 0;
while (*key)
{
h = (h << 4) + (*key++); //h左移4位,当前字符ASCII存入h的低四位
if ((x = h & 0xF0000000L) != 0)
{ //如果最高位不为0,则说明字符多余7个,如果不处理,再加第九个字符时,第一个字符会被移出
//因此要有如下处理
h ^= (x >> 24);
//清空28~31位
h &= ~x;
}
}
return h % hash_base;
}
bool hash_insert(char s1[],char s2[]){
int h=ELFhash(s2);
int u=hash_table[h];
hash_table[h]=cur;
val[cur].next=u;
//val[cur++]=node(s1,s2);
strcpy(val[cur].s1,s1);
strcpy(val[cur].s2,s2);
++cur;
return true;
}
void search(char s[]){
int h=ELFhash(s);
int u=hash_table[h];
while(u!=-1){
if(strcmp(val[u].s2,s)==0) { //find
printf("%s\n",val[u].s1);
return;
}
u=val[u].next;
}
printf("eh\n"); //not found
}
int main(){
for(int i=0;i<maxn;++i){
val[i].next=-1;
}
memset(hash_table,-1,sizeof(hash_table));
char s1[11],s2[11];
char s[40];
while(1){
gets(s);
if(s[0]=='\0') break;
sscanf(s,"%s %s",s1,s2);
hash_insert(s1,s2);
}
char u[11];
while(scanf("%s",u)==1){
search(u);
}
return 0;
}
如有不当之处欢迎指出!