模板 - 字符串 - 哈希

传说中的大名鼎鼎的DJB哈希(谐音?)

ll DJBhash(){
    ll hash=5381;
    int l=strlen(s);
    for(int i=0;i<l;i++){
        hash=((hash<<5)+hash)+s[i];
    }
    return hash;
}

配套一个map使用就可以了,碰撞概率很低。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n;
char s[1505];

map<ll,int> m;

ll DJBhash(){
    ll hash=5381;
    int l=strlen(s);
    for(int i=0;i<l;i++){
        hash=((hash<<5)+hash)+s[i];
    }
    return hash;
}


int main(){
    scanf("%d",&n);
    while(n--){
        scanf("%s",s);
        ll res=DJBhash();
        m[res]++;
    }
    printf("%u\n",m.size());
}

猜你喜欢

转载自www.cnblogs.com/Yinku/p/10555265.html