博客园 首页 私信博主 显示目录 隐藏目录 管理

【模板】字符串哈希

给定N个字符串,请求出N个字符串中共有多少个不同的字符串。

Hans:没有用什么高级东西处理冲突也没有写map水过去,而且是一个哈希哈哈哈哈。

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int p = 998244353;

int n;
ll tot, cnt;
char s[10010];

set<ll> S;

int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        tot = 0;

        scanf("%s", s);
        for(int j = 0; j < strlen(s); j++){
            int x = (int)s[j];
            tot = tot * 10007ll + x;
        }
        if(!S.count(tot)){
            cnt++;
            S.insert(tot);
        }
    }

    printf("%lld\n", cnt);
    return 0;
}

题解区各种答案:
双哈希

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
ull base=131;
struct data
{
    ull x,y;
}a[10010];
char s[10010];
int n,ans=1;
ull mod1=19260817;
ull mod2=19660813;
ull hash1(char s[])
{
    int len=strlen(s);
    ull ans=0;
    for (int i=0;i<len;i++)
        ans=(ans*base+(ull)s[i])%mod1;
    return ans;
}
ull hash2(char s[])
{
    int len=strlen(s);
    ull ans=0;
    for (int i=0;i<len;i++)
        ans=(ans*base+(ull)s[i])%mod2;
    return ans;
}
bool comp(data a,data b)
{
    return a.x<b.x;
}
main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%s",s);
        a[i].x=hash1(s);
        a[i].y=hash2(s);
    }
    sort(a+1,a+n+1,comp);
    for (int i=2;i<=n;i++)
        if (a[i].x!=a[i-1].x || a[i-1].y!=a[i].y)
            ans++;
    printf("%d\n",ans);
}

set

#include<bits/stdc++.h>
using namespace std;
int n;
string t;
std::set<string> s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>t;
        s.insert(t);
    }
    cout<<s.size()<<endl;
    return 0;
}

map

#include<bits/stdc++.h>//万能库 
using namespace std;
map <string,bool> mp;//定义一个键值为string,映射值为bool的map 
int ans,n;
string a;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        if(!mp.count(a))//如果之前没有过这个映射 
        {
            ans++;//答案加一 
            mp[a]=1;//记录 
        }
    }
    printf("%d\n",ans);
    return 0;
}

pd_ds库 自带hash_table

#include<cstdio>
#include<iostream>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#define f(i,a,b) for(register int i=int(a);i<=int(b);++i)
using namespace std;
__gnu_pbds::cc_hash_table<string,int>ht;//或者gp_hash_table,貌似慢一点 
int main()
{
    int n,sum=0;
    string s,instead;
    scanf("%d",&n);getline(cin,instead);
    f(i,1,n)
    {
        getline(cin,s);
        if(!ht[s])ht[s]=1,++sum;
    }
    printf("%d\n",sum);
}

BKDR Hash

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ULL;
ULL h[100000];
ULL seed=163;
inline ULL hash(string x){
    ULL Hash=0;
    int len=x.length()-1;
    for(int i=0;i<=len;++i){
        Hash=Hash*seed+x[i]-'0';
    }
    return Hash;
}

int main(){
    int n;
    cin>>n;
    string que;
    for(int i=1;i<=n;++i){
        cin>>que;
        h[i]=hash(que);
    }
    sort(h+1,h+n+1);
    int ans=0;
    for(int i=1;i<=n;++i){
        if(h[i]!=h[i+1])    ans++;
    }
    cout<<ans;
    return 0;
}

差不多了吧。附上路过随机抽取的博客链接
Here

posted @ 2017-10-17 07:59  Hanser  阅读(145)  评论(0编辑  收藏  举报