【题目来源】​​题目传送门​

【题意】上篇文章已经说明过题意了,那里的map裸跑1500ms+,用assign优化之后跑出900ms+,尝试hash跑出188ms,时间上的优化是非常巨大的。

【本题AC代码,Hash】

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define CLE(a,b) memset(a,b,sizeof(a))
#define ull unsigned long long
const int nn = 100010;
const int maxn = 1000010;
const int HASH = 1000003;
int head[maxn],Next[nn];
char s1[nn][25],s2[nn][25];
int n;
int get_hash(char *s)
{
int ret = 0;
int seed = 131;
while(*s)
{
ret = ret * seed + *(s++);
}
return (ret & 0x7fffffff) % HASH;
}

void Input()
{
CLE(head,-1);
n = 0;
char ch[30];
gets(ch);
while(ch[0]!='\0')
{
int i=0,j;
for(i=0,j=0; ch[i]!=' '; i++,j++)
s1[n][j] = ch[i];
s1[n][j] = '\0';
i++;
for(j=0; ch[i]!='\0'; i++,j++)
s2[n][j] = ch[i];
s2[n][j] = '\0';
int id = get_hash(s2[n]);
Next[n] = head[id];
head[id] = n;
n++;
gets(ch);
}
}

int Find(char *s)
{
int i;
int tmp = get_hash(s);
for(i=head[tmp]; i!=-1; i=Next[i])
{
if(strcmp(s,s2[i])==0) break;
}
return i;
}
void work()
{
char s[15];
while(~scanf("%s",s))
{
int id = Find(s);
if(id==-1)
{
puts("eh");
}
else
{
printf("%s\n",s1[id]);
}
}
}
int main()
{
Input();
work();
return 0;
}


【典型板子比较】


 RS Hash Function 】



【ELF Hash Function】



【BKDR Hash Function】



【 DJB Hash Function】


【总结】各种字串hash板子的时间差距都不是很大,这道题目里,貌似ELFHASH是最快的。

【ACMER菜鸟的努力历程】太弱了,加油。