码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【数据结构】哈希


    知识点

    一 . 字符串哈希函数构造 


    一 . 字符串哈希函数构造 

    字符串哈希通过牺牲很小的准确率,达到快速进行字符串匹配的效果 

    例题: 洛谷 P3370 【模板】字符串哈希

    题目描述

    如题,给定 N 个字符串(第 i 个字符串长度为 M_i,字符串内包含数字、大小写字母,大小写敏感),请求出 N 个字符串中共有多少个不同的字符串。

    输入格式

    第一行包含一个整数 N,为字符串的个数。

    接下来 N 行每行包含一个字符串,为所提供的字符串。

    输出格式

    输出包含一行,包含一个整数,为不同的字符串个数。

    输入输出样例

    输入 #1

    5
    abc
    aaaa
    abc
    abcc
    12345

    输出 #1

    4

    说明/提示

    对于 30% 的数据:N\leqslant 10,M_i \approx 6,M_{max}\leqslant 15。

    对于 70% 的数据:N\leqslant 1000,M_i \approx100,M_{max}\leqslant 150。

    对于 100% 的数据:N\leqslant 10000,M_i\approx 1000,M_{max} \leqslant 1500。

     处理方法1:自然溢出法

    1. #include
    2. #include
    3. #include
    4. #include
    5. #define ll unsigned long long
    6. using namespace std;
    7. int n;
    8. const int maxn=1e7+5,base=131; //base表示进制数
    9. const ll int mod=19260817891;
    10. ll int a[maxn]; //a[]即哈希表
    11. int res=0;
    12. char s[maxn];
    13. inline ll int hash_check(char s[])
    14. {
    15. ll int len=strlen(s),ans=0;
    16. for(int i=0;i
    17. {
    18. ans=ans*base+(ll)s[i]; //利用自然数溢出,即超过2*64自动溢出,节省时间
    19. }
    20. return ans;
    21. }
    22. int main()
    23. {
    24. scanf("%d",&n);
    25. for(int i=1;i<=n;++i)
    26. {
    27. scanf("%s",s);
    28. a[i]=hash_check(s);
    29. }
    30. sort(a+1,a+n+1);
    31. for(int i=1;i<=n;++i)
    32. {
    33. if(a[i]!=a[i+1]) res++;
    34. }
    35. printf("%d",res);
    36. return 0;
    37. }

    方法2:单hash表

    该题与自然溢出唯一不同的地方是:在进行散列的时候,与一个很大的整数进行取模。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #define ll unsigned long long
    6. using namespace std;
    7. int n;
    8. const int maxn=1e7+5,base=131;
    9. const ll int mod=19260817891;
    10. ll int a[maxn];
    11. int res=0;
    12. char s[maxn];
    13. inline ll int hash_check(char s[])
    14. {
    15. ll int len=strlen(s),ans=0;
    16. for(int i=0;i
    17. {
    18. ans=(ans*base+(ll)s[i])%mod; //唯一的不同之处
    19. }
    20. return ans;
    21. }
    22. int main()
    23. {
    24. scanf("%d",&n);
    25. for(int i=1;i<=n;++i)
    26. {
    27. scanf("%s",s);
    28. a[i]=hash_check(s);
    29. }
    30. sort(a+1,a+n+1);
    31. for(int i=1;i<=n;++i)
    32. {
    33. if(a[i]!=a[i+1]) res++;
    34. }
    35. printf("%d",res);
    36. return 0;
    37. }

  • 相关阅读:
    改进差分进化算法及其求解柔性作业车间调度问题(Python代码实现)
    MySQL的内外连接
    C++ 纠错题总结2
    C# 基类中的虚函数调用基类的虚函数执行的是派生类实现的对应函数吗
    C++程序开启大地址(虚拟内存),让32位程序使用4G内存的方,虚拟内存概念及寻址范围详解
    MySQL运维7-Mycat分库分表之取模分片
    [源码系列:手写spring] IOC第十四节:容器事件和事件监听器
    向量数据库的分类概况
    29.STM32红外遥控器
    vue封装自己的组件库 02.封装dialog组件
  • 原文地址:https://blog.csdn.net/gzkeylucky/article/details/126810509
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号