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

    哈(luan)希(gao)简单来说就是把一整个字符串映射到一个整数中

    过程可以这样表示:hash[i]=(hash[i-1]*HASH+num(s[i]))%mod;

    一般情况下我们为了保险起见一般使用双哈希

    真没什么好说的了,上模板吧

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    const long long mod1=13131;
    const long long mod2=131313;
    const long long hash=1e9+7;
    bool have1[mod1+3],have2[mod2+3];
    int main()
    {     long long n,m,i,j,k,sum=0;
          cin>>n;
          for(i=1;i<=n;i++){
              string s;
              cin>>s;
              m=s.length();
              long long hh1=1,hh2=1;
              for(j=0;j<m;j++){
                  hh1=(hh1*hash%mod1+(s[j]-'0')%mod1)%mod1;
                  hh2=(hh2*hash%mod2+(s[j]-'0')%mod2)%mod2;
              }
              if(!have1[hh1]||!have2[hh2])sum++,have1[hh1]=1,have2[hh2]=1;
          }
          cout<<sum<<endl;
          return 0;
    }
    哈希这种东西比较玄学,还需体会精神

    可用的哈希数有很多,详见我博客推荐的第二篇

  • 相关阅读:
    累加和最大化
    SELECT子句顺序
    Linux命令入门教程
    求字符串前缀最长的连续重复子串(不重叠)
    王道机试指南题解(C/C++版)
    C++ Primer 第 5 版 习题参考答案
    第 16 章
    第 15 章
    第 14 章
    从jvm源码解读Java运行时的类加载
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/7881705.html
Copyright © 2011-2022 走看看