POJ 2503 Babelfish(Hash)

【题目来源】题目传送门

【题意】上篇文章已经说明过题意了,那里的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菜鸟的努力历程】太弱了,加油。


你可能感兴趣的:(POJ 2503 Babelfish(Hash))