zoukankan      html  css  js  c++  java
  • POJ 1200 Crazy Search 字符串的Hash查找

    第一次涉及HASH查找的知识

    对于字符串的查找有很多前人开发出来的HASH函数,比较常用的好像是ELF 和 BKDR。

    这道题没想到突破点是在于其nc值,告诉你组成字符串的字母种类。

    还有用26进制,不管怎么说,只要避免产生冲突,怎么哈希都行。

    用的是BKDRHash法。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define maxn 20000000
    #define mm 1000000
    using namespace std;
    int hash[maxn]={0};
    char str[mm];
    int news[mm]={0};
    
    int ans;
    int n,nc;
    
    int BKDRHash(char *key)
    {
        int seed=nc;
        int p=0;
        //cout<<"pass";
        while (*key)
        {
            p=p*seed+(news[(*key++)-'a']);
        }
        return (p & 0x7FFFFFFF);
    }
    void hashit (char *s)
    {
        //memset(hash,0,sizeof hash);
        int i,j,k;
        char ch[mm];
    
        for (i=0;s[i+n-1];i++)
        {
            for (j=0;j<n;j++)
             ch[j]=s[i+j];
            ch[j]='';
            //puts(ch);
            int k=BKDRHash(ch);
            k%=maxn;
            //cout<<k<<endl;
            if (!hash[k])
            {
             ans++;
             hash[k]=1;
             //cout<<"pass"<<endl;
            }
    
        }
    }
    int main()
    {
    
        while (scanf("%d %d",&n,&nc)!=EOF)
        {
            ans=0;
            getchar();
            gets(str);
            int cnt=1;
            int i,j;
            for (i=0;str[i];i++)
            {
                if (news[str[i]-'a']==0) //使用二十六进制
                 news[str[i]-'a']=cnt++;
            }
            hashit(str);
            printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    数据结构-查找-有序查找
    发现新大陆 --21lic
    专利检索
    IT行业新闻事件
    流量校准仪开发日志-2017-10-24
    电池充电方案总结
    iOS中创建自定义的圆角按钮
    iOS 内存管理实践
    iOS 内存管理策略
    [置顶] 内存管理一点也不神秘————手绘iOS内存管理细节
  • 原文地址:https://www.cnblogs.com/kkrisen/p/3272705.html
Copyright © 2011-2022 走看看