题目: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. Java中日期格式化的实现算法

    package com.study.test; import java.io.Serializable; import java.text.SimpleDateFormat; import java. ...

  2. 论文解读(GCC)《Graph Contrastive Clustering》

    论文信息 论文标题:Graph Contrastive Clustering论文作者:Huasong Zhong, Jianlong Wu, Chong Chen, Jianqiang Huang, ...

  3. [AcWing 53] 最小的 k 个数

    堆排序 点击查看代码 class Solution { public: vector<int> getLeastNumbers_Solution(vector<int> inp ...

  4. FreeRTOS --(3)内存管理 heap2

    在<FreeRTOS --(2)内存管理 heap1>知道 heap 1 的内存管理其实只是简单的实现了内存对齐的分配策略,heap 2 的实现策略相比 heap 1 稍微复杂一点,不仅仅 ...

  5. PHP 运行 mkdir() Permission Denied 的原因

    使用lamp,在上传文件时,PHP执行 mkdir($path) ,  出现没有权限的错误. 解决: 本次使用的时yii框架,所以首先确保 是apache的用户对web目录有权限,然后再给此用户加 r ...

  6. Linux学习教程 | 全文目录

    本教程最大的特点是通俗易懂,并且非常详细,花费 7 天时间即可快速了解 Linux. 第一章 Linux简介 1.1 操作系统是什么,操作系统概述 1.2 Linux是什么,有哪些特点? 1.3 Li ...

  7. 1.9 初学者应选择哪个Linux发行版?

    前面章节中,已经对几个常见的 Linux 发行版做了简单的介绍,那么对于初学者来说,选择哪个发行版的性价比更高呢? 通常情况下,初学者学习 Linux,是为了找一份和 Linux 相关的工作,那么问题 ...

  8. go thrift 开发

    thrift 从 0.9.1版本开始,可以完美支持 go 语言,可以完美的实现跨语言的 rpc 调用了.下面以 go 和 java 语言相互调用为例. 编辑协议文件,go 语言示例 /** examp ...

  9. [持续更新] Python学习、使用过程中遇见的非代码层面知识(想不到更好的标题了 T_T)

    写在前面: 这篇博文记录的不是python代码.数据结构.算法相关的内容,而是在学习.使用过程中遇见的一些没有技术含量,但有时很令人抓耳挠腮的小东西.比如:python内置库怎么看.python搜索模 ...

  10. mysql外键与表查询

    目录 自增特性 外键 外键关系 外键创建 外键的约束效果 级联更新级联删除 多对多关系 一对一关系 表查询关键字 select与from where筛选 group by分组 练习 关系练习 查询练习 ...