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 ... 
随机推荐
- who 的页面制作
			1. html 结构 <!-- section: Who we are --> <section id="who"> <div class=" ... 
- 初踩坑JS加载与audio接口:点击头像开始/暂停背景音乐
			背景 封楼期间难得空闲,也静不下心学习,空闲之余萌生了重做引导单页的想法.因为之前都是扒站(某大公司游戏官网)+小改,一来虽然很炫酷,但本人水平有限,仍有很大一部分JS无从下手,甚至是看不懂|-_-| ... 
- 最大数maxnumber - 题解【树状数组】
			原题: 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. 插入操作.语法 ... 
- java 中为什么重写 equals 后需要重写 hashCode
			本文为博主原创,未经允许不得转载: 1. equals 和 hashCode 方法之间的关系 这两个方法都是 Object 的方法,意味着 若一个对象在没有重写 这两个方法时,都会默认采用 Objec ... 
- 技术分享 | Selenium 测试用例编写
			编写Selenium测试用例就是模拟用户在浏览器上的一系列操作,通过脚本来完成自动化测试. 编写测试用例的优势: 开源,免费. 支持多种浏览器 IE,Firefox,Chrome,Safari. 支持 ... 
- STS快捷键
			在类或者方法上方加注释:shift+alt+J 
- 攻防世界-MISC:base64stego
			这是攻防世界新手练习区的第十一题,题目如下: 点击下载附件一,发现是一个压缩包,点击解压,发现是需要密码才能解密 先用010editor打开这个压缩包,这里需要知道zip压缩包的组成部分,包括压缩源文 ... 
- 2003031121——浦娟——Python数据分析第七周作业——MySQL的安装及使用
			项目 要求 课程班级博客链接 20级数据班(本) 作业要求链接 Python第七周作业 博客名称 2003031121--浦娟--Python数据分析第七周作业--MySQL的安装及使用 要求 每道题 ... 
- 1.4 类UNIX系统是什么鬼?
			上节<UNIX和Linux的区别>中讲到了 UNIX 系统的历史,UNIX 是操作系统的开山鼻祖,是操作系统的发源地,后来的 Windows 和 Linux 都参考了 UNIX. 有人说, ... 
- Linux下使用ssh测试端口是否开启
			当服务器上不允许使用telnet时,可以使用ssh测试远程服务器端口是否开启 具体命令如下 -v 显示连接debug信息 -p port 指定端口 ssh -v -p 80 root@192.168. ... 
