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

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

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

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

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

属于哈希模板题

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

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

一:对公式的推导

首先是基本公式 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的优化

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

三:比较

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

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

 

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. 2021.12.06 P2508 [HAOI2008]圆上的整点(数论+ π )

    2021.12.06 P2508 [HAOI2008]圆上的整点(数论+ \(\pi\) ) https://www.luogu.com.cn/problem/P2508 题意: 求一个给定的圆 \( ...

  2. 2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分)

    2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分) https://www.luogu.com.cn/problem/P2375 题意: PS:这道神题的背景让人疑惑,重 ...

  3. Vue.js Mixins 混入使用

    Mixins一般有两种用途: 1.在你已经写好了构造器后,需要增加方法或者临时的活动时使用的方法,这时用混入会减少源代码的污染. 2.很多地方都会用到的公用方法,用混入的方法可以减少代码量,实现代码重 ...

  4. 【FAQ】HMS Core推送服务与本地创建通知消息如何相互覆盖?

    我们知道,单独使用HMS Core推送服务或本地创建通知消息,都可以实现通知消息的覆盖,方式分别为: 1.本地创建通知消息(简称本地通知消息) 通过notificationManager.notify ...

  5. css兼容问题集锦

    BEGIN; 1.文本框很大,导致里面的内容不居中.以及内容为数字时,不支持text-indent属性 解:line-height: K px; (值为文本框的height值). 2.文本框有背景图片 ...

  6. 软件工程-UML各种图总结-精华

    ​ UML(Unified Modeling Language)是一种统一建模语言,为面向对象开发系统的产品进行说明.可视化.和编制文档的一种标准语言.下面将对UML的九种图+包图的基本概念进行介绍以 ...

  7. 【CSAPP】Bomb Lab实验笔记

    bomblab这节搞的是二进制拆弹,可以通俗理解为利用反汇编知识找出程序的六个解锁密码. 早就听闻BOMBLAB的大名,再加上我一直觉得反汇编是个很艰难的工作,开工前我做好了打BOSS心理准备.实际上 ...

  8. SSH只能用于远程Linux主机?那说明你见识太小了!

    开源Linux 长按二维码加关注~ 今天小编为大家分享一篇关于SSH 的介绍和使用方法的文章.本文从SSH是什么出发,讲述了SSH的基本用法,之后在远程登录.端口转发等多种场景下进行独立的讲述,希望能 ...

  9. XPath语法和lxml模块

    XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...

  10. 136. Single Number - LeetCode

    Question 136. Single Number Solution 思路:构造一个map,遍历数组记录每个数出现的次数,再遍历map,取出出现次数为1的num public int single ...