013(oulipo)
题目: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)的更多相关文章
- C++之路进阶——poj3461(Oulipo)
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35694 Accepted: 14424 Descript ...
- poj3461 Oulipo(KMP模板)
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17795 Accepted: 7160 Descripti ...
- Match:Oulipo(POJ 3461)
Oulipo 题目大意:给你一个字符串,要你找到字符串包含指定子串的个数 只要你知道了KMP,这一题简直不要太简单,注意STL的string是会超时的,还是乖乖用char吧 #include < ...
- KMP算法 hdu4686 Oulipo
Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, w ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数013,shape模型
<zw版·Halcon-delphi系列原创教程> Halcon分类函数013,shape模型 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“pr ...
- hdu----1686 Oulipo (ac自动机)
Oulipo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 字符串hash - POJ 3461 Oulipo
Oulipo Problem's Link ---------------------------------------------------------------------------- M ...
- POJ 3461 Oulipo
E - Oulipo Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- Oulipo (kmp)
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26857 Accepted: 10709 Descript ...
随机推荐
- 《手把手教你》系列基础篇(九十)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-中篇(详解教程)
1.简介 上一篇宏哥介绍是如何使用logback将日志输出到控制台中,但是如果需要发给相关人需要你拷贝出来,有时候由于控制台窗口的限制,有部分日志将会无法查看,因此我们还是需要将日志输出到文件中,因此 ...
- 在IDEA中已经配置postgis数据库驱动并且能在Java类中连接数据库,但在servlet中无法连接数据库且导致Tomcat自动断开连接的解决方案
最近在IDEA中用JDBC连接PostgreSQL数据库时遇到了这样一个奇怪的事情: 从PostgreSQL JDBC Driver官网下载好JDBC驱动之后,在IDEA的Project Struct ...
- 手把手带你入门ECharts
1.什么是ECharts ECharts,缩写来自Enterprise Charts,商业级数据图表,是来自百度商业前端数据可视化团队EFE的一个开源的纯Javascript的图表库,可以流畅的运行在 ...
- 真实本人亲测Elasticsearch未授权访问漏洞——利用及修复【踩坑指南到脱坑!】
如要转载请注明出处谢谢: https://www.cnblogs.com/vitalemontea/p/16105490.html 1.前言 某天"发现"了个漏洞,咳咳,原本以为这 ...
- go-micro集成链路跟踪的方法和中间件原理
前几天有个同学想了解下如何在go-micro中做链路跟踪,这几天正好看到wrapper这块,wrapper这个东西在某些框架中也称为中间件,里边有个opentracing的插件,正好用来做链路追踪.o ...
- 零基础学Java第一节(语法格式、数据类型)
本篇文章是<零基础学Java>专栏的第一篇文章,从本篇文章开始,将会连更本专栏,带领大家将Java基础知识彻底学懂,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! ...
- 438. Find All Anagrams in a String - LeetCode
Question 438. Find All Anagrams in a String Solution 题目大意:给两个字符串,s和p,求p在s中出现的位置,p串中的字符无序,ab=ba 思路:起初 ...
- CentOS删除编译安装的Python3
编译安装Python3 # 下载 # wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz wget http://mirr ...
- [持续更新] Python学习、使用过程中遇见的非代码层面知识(想不到更好的标题了 T_T)
写在前面: 这篇博文记录的不是python代码.数据结构.算法相关的内容,而是在学习.使用过程中遇见的一些没有技术含量,但有时很令人抓耳挠腮的小东西.比如:python内置库怎么看.python搜索模 ...
- 主管发话:一周搞不定用友U8 ERP跨业务数据分析,明天就可以“毕业”了
随着月末来临,又到了汇报总结的时刻. (图片来自网络) 到了这个特殊时期,你的老板就一定想要查看企业整体的运转情况.销售业绩.客户实况分析.客户活跃度.Top10 sales. 产品情况.订单处理情况 ...