题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1455

题目描述:在母串里找子串出现的次数

题目思路:与字符串的搜索有关那就立刻找到哈希

从s[1]到s[m]将从第1位到第i位的哈希值算出来

在以m-n为固定的差值定义字串长度,在找到每一个子串

属于哈希模板题

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int b=31;//我们需要一个质数
  4. #define N 1000001
  5. #define ull unsigned long long
  6. //需要一个超级大的存储,否则数字太大,如果溢出过多就会很麻烦
  7. ull p[N],sum[N],x;
  8. int t,ans,i,n,m;
  9. char s1[N],s2[N];
  10. int main(){
  11. p[0]=1;//(b^0=1)
  12. for(i=1;i<=N;++i){
  13. p[i]=p[i-1]*b;//先把这些次方都存起来,以后有用
  14. }
  15. scanf("%d",&t);
  16. while(t--){
  17. ans=0;
  18. scanf("%s%s",s1+1,s2+1);
  19. //s1是我们要找的子串
  20. //s2是母串
  21. n=strlen(s1+1);//长度
  22. m=strlen(s2+1);//长度
  23. sum[0]=0;//先初始化防止后面根据公式计算哈希值的时候有多余的东西
  24. for(i=1;i<=m;++i){
  25. sum[i]=sum[i-1]*b+(ull)(s2[i]-'A'+1);
  26. }//声明:公式H[m]=(C[1]*b^(m-1)+C[2]*b^(m-2)+...+C[m]*1)
  27. x=0;//同样的道理
  28. for(i=1;i<=n;++i){
  29. x=x*b+(ull)(s1[i]-'A'+1);
  30. }
  31. for(i=0;i<=m-n;++i){
  32. if(x==sum[i+n]-sum[i]*p[n]){
  33. //如果分段上的哈希值对上了
  34. //注:以第一个数字为将要搜索的子串的起点,一直轮班到第m-n个,可以找遍所有子串
  35. //(sum[i+n]-sum[i]*p[n])是计算子串哈希的公式,可以做一个H[m]和H[n]自行推导(m<n)
  36. ans++;//搜索数量加1
  37. }
  38. }
  39. printf("%d\n",ans);//输出
  40. }
  41. return 0;
  42. }

题目总结:做好哈希一类的题我们需要考虑三个方面

一:对公式的推导

首先是基本公式 H[m]=(C[1]*b^(m-1)+C[2]*b^(m-2)+...+C[m]*1)

然后就是对子串的计算

对于C'=C[1]C[2]...C[n]

H[C']=H[k+n]-H[k]*b^n

二:对b^n的优化

直接在前面就存是最好的选择

三:比较

哈希值相同的字符串大概率相同,在一些题目中可以近似为一定相同

哈希值不同的字符串一定不同

  1.  

013(oulipo)的更多相关文章

  1. C++之路进阶——poj3461(Oulipo)

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 35694   Accepted: 14424 Descript ...

  2. poj3461 Oulipo(KMP模板)

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17795   Accepted: 7160 Descripti ...

  3. Match:Oulipo(POJ 3461)

     Oulipo 题目大意:给你一个字符串,要你找到字符串包含指定子串的个数 只要你知道了KMP,这一题简直不要太简单,注意STL的string是会超时的,还是乖乖用char吧 #include < ...

  4. KMP算法 hdu4686 Oulipo

    Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, w ...

  5. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数013,shape模型

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数013,shape模型 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“pr ...

  6. hdu----1686 Oulipo (ac自动机)

    Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  7. 字符串hash - POJ 3461 Oulipo

    Oulipo Problem's Link ---------------------------------------------------------------------------- M ...

  8. POJ 3461 Oulipo

      E - Oulipo Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  9. Oulipo (kmp)

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26857   Accepted: 10709 Descript ...

随机推荐

  1. VulnHub-Earth 打靶记录

    目录 VulnHub-Earth 打靶记录 知识点 目标探测 信息收集 Shell反弹&信息二次收集 提权 权限维持 VulnHub-Earth 打靶记录 搭建靶场的时候一定要使用NATser ...

  2. 数据传输POST心法分享,做前端的你还解决不了这个bug?

    背景 随时随地给大家提供技术支持的葡萄又来了.这次的事情是这样的,提供demo属于是常规操作,但是前两天客户突然反馈压缩传输模块抛出异常,具体情况是压缩内容传输到服务端后无法解压. 由于代码没有发生任 ...

  3. Infrastructure 知识: dnf对module的处理

    引言 从RHEL8/CentOS8开始,dnf取代yum作为rpm 包管理工具.与之而来的还有模块(module)这个东西. 有了它们的加持,让在同一个OS上安装不同版本的软件或者开发语言的工作比之前 ...

  4. 干货|SQL语句大全,所有的SQL都在这里了(建议收藏)

    一个执着于技术的公众号 一.基础 1.登录数据库 mysql -uroot -p123123 2.创建数据库 create database <数据库名> 3.删除数据库 drop dat ...

  5. .NET ORM 仓储层必备的功能介绍之 FreeSql Repository 实现篇

    写在开头 2018年11月的某一天,头脑发热开启了 FreeSql 开源项目之旅,时间一晃已经四年多,当初从舒服区走向一个巨大的坑,回头一看后背一凉.四年时间从无到有,经历了数不清的日夜奋战(有人问我 ...

  6. .NET混合开发解决方案12 网页JS调用C#方法访问WinForm或WPF窗体

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  7. Web安全学习笔记 SQL注入上

    Web安全学习笔记 SQL注入上 繁枝插云欣 --ICML8 SQL注入分类 SQL注入检测 一.注入分类 1.简介 SQL注入是一种代码注入技术用于攻击数据驱动的应用程序在应用程序中,如果没有做恰当 ...

  8. PowerJob高级特效-容器部署完整教程

    介绍 powerjob提供了容器功能,用来做一些灵活的任务处理.这里容器为 JVM 级容器,而不是操作系统级容器(Docker).(至于为什么取"容器"这个有歧义的名字是因为作者没 ...

  9. HAVING,多表查询思路,可视化软件navicat,多表查询练习题,

    HAVING "where"是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之 前起作用,且"where"后面不能写&quo ...

  10. 万字长文深度剖析 RocketMQ 设计原理

    幸福的烦恼 张大胖最近是又喜又忧,喜的是业务量发展猛增,忧的是由于业务量猛增,一些原来不是问题的问题变成了大问题,比如说新会员注册吧,原来注册成功只要发个短信就行了,但随着业务的发展,现在注册成功也需 ...