zoukankan      html  css  js  c++  java
  • 【模板】字符串哈希

    给定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

  • 相关阅读:
    sb世博
    seo 工具集锦
    各种Windows 操作系统中的 .NET Framework 支持
    httplib2模拟登陆
    python tips
    B2C电子商务能否通吃线上线下?
    复制镜像
    Scale Stack vs node.js vs Twisted vs Eventlet
    pool=eventlet.GreenPool(20)
    nginx最新部署
  • 原文地址:https://www.cnblogs.com/hanser/p/7679786.html
Copyright © 2011-2022 走看看