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);
        }
    }
  • 相关阅读:
    数据流控制
    转:简单的Mysql主从复制设置
    转:CentOS---网络配置详解
    Linux-vim学习入门
    Linux图形界面与字符界面切换
    转:MySQL表名不区分大小写
    CentOS6.5_x86安装Mysql5.5.49
    Linux的环境变量设置和查看
    Linux防火墙的关闭和开启
    Linux command not found 问题解释
  • 原文地址:https://www.cnblogs.com/kkrisen/p/3272705.html
Copyright © 2011-2022 走看看