zoukankan      html  css  js  c++  java
  • 字符串哈希

    字符串哈希前缀和

    ULL get(int l, int r)
    {
        return h[r] - h[l - 1] * p[r - l + 1];
    }
    int main()
    {
        cin >> n >> m >> str + 1;
        p[0] = 1;
        for(int i = 1; i <= n; i ++ ){
            p[i] = p[i - 1] * P;
            h[i] = h[i - 1] * P + str[i];
        }
    View Code

    普通哈希

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int mod=5009;
    struct p{
        int to,nxt;
    }d[50009];int head[50009],cnt=1;
    bool add(int x)
    {
        int now=(x%mod+mod)%mod;
        for(int i=head[now];i;i=d[i].nxt)
            if(d[i].to==x)    return false;
        d[cnt].to=x,d[cnt].nxt=head[now];
        head[now]=cnt++;
        return true;
    }
    int main()
    {
        int t,n;
        cin>>t;
        while(t--)
        {
            cin>>n;
            cnt=1;
            memset(d,0,sizeof(d));memset(head,0,sizeof(head));
            for(int i=1;i<=n;i++)
            {
                int x;scanf("%d",&x);
                if(add(x))    printf("%d ",x);
            }
            cout<<endl;
        }
        return 0;
    }
    View Code

    字符串哈希

    溢出哈希

    #include <bits/stdc++.h>
    using namespace std;
    typedef unsigned long long ull;
    ull base=131;//131进制
    ull a[10010];//hash后的数组
    int n,ans=1;
    ull hashs(string s)
    {
        int l=s.length();
        ull he=0;
        for(int i=0;i<l;i++)
            ans=ans*base+(ull)s[i];//溢出相当于取模
        return ans&0x7fffffff;    
    } 
    int main()
    {
        scanf("%d",&n);
        string s;
        for(int i=1;i<=n;i++)
        {
            cin>>s;
            a[i]=hashs(s);
        }
        sort(a+1,a+1+n);
        for(int i=2;i<=n;i++)
            if(a[i]!=a[i-1])
                ans++;
        cout<<ans;
    }
    View Code

    双模数哈希

    #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
    ",ans);
    }
    View Code
  • 相关阅读:
    用python自定义实现db2的连接池
    python写的爬虫工具,抓取行政村的信息并写入到hbase里
    201521123119《Java程序设计》第4周学习总结
    201521123119《Java程序设计》第5周学习总结
    201521123119《Java程序设计》第6周学习总结
    201521123119《Java程序设计》第1周学习总结
    log4j:WARN No appenders could be found for logger
    android 单元测试
    android手机屏幕适配2
    android手机屏幕适配
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12520916.html
Copyright © 2011-2022 走看看