POJ 1200 Crazy Search 查找有多少种不同的子串(hash)
文章目录
- 1.采用map解题
- 2.采用hash查找
题目链接: http://poj.org/problem?id=1200
题目大意:给定子串长度,字符中不同字符数量,以及一个字符串,求不同的子串数量。
1.采用map解题
把子串插入map,map自动去重,最后输出map的size
结果是超时的。
超时代码:
/*** @description: http://poj.org/problem?id=1200,采用map解题* @author: michael ming* @date: 2019/5/8 16:14* @modified by: */
#include <iostream>
#include <stdio.h>
#include <map>
#include <string>
using namespace std;
int main()
{size_t sublen, diffchar;scanf("%d%d",&sublen,&diffchar);map<string, int> substring;string str, substr;cin >> str;size_t len = str.size();for(size_t i = 0, j = i+sublen-1; j < len; i++,j++){substr = str.substr(i, sublen);substring.insert(pair<string, int>(substr, 1));}cout << substring.size();return 0;
}
2.采用hash查找
- 先将字符串中先后出现的字符映射成1,2,3,4…比如abac(1213)
- 在将每个子串对应的
sublen
个字符哈希得到哈希值,因为题目说可能的子串组合小于1600万种,我们把得到的哈希值对1600万求模,存在数组中置为1(初始为0)。 - 对后面的子串的哈希值在数组中检查,如果为0,则不存在,种类+1,如果为1,说明这种子串已存在,跳过,循环遍历字符串
- hash可以实现O(1)时间复杂度查找,所以时间比较短。
- 该题目情况下,所有子串要求的长度是一样的,用类似m进制数的哈希函数没有冲突,如果子串长度不要求一样,则以下求解方法存在冲突可能(一个很长的子串哈希完的哈希int值溢出了,即高位舍弃变成很小的数,这可能与短字符串的哈希值一样,造成冲突)。
AC代码:
/*** @description: 计算子串的种数* @author: michael ming* @date: 2019/5/8 17:20* @modified by: */
#include <iostream>
#include <string>
#include <memory.h>
using namespace std;
void chartoint(string &str, int *num) //把字符中出现过的字符转成1开始的数字
{int value = 1;int len = str.size();for(int i = 0; i < len; ++i){if(num[str[i]] == 0)num[str[i]] = value++;}
}
size_t hashfunc(int i, int j, int m, int *num, string &str) //计算子串hash值
{int hashValue = 0;for(int k = i; k <= j; ++k)hashValue = hashValue*m + num[str[k]];return hashValue;
}
int main()
{const unsigned int max = 16000001;int num[300] = {0};size_t *hash = new size_t[max];memset(hash, 0, sizeof(hash));int sublen, m;int result = 0;string str;cin >> sublen >> m >> str;chartoint(str, num);for(int i = 0; i <= str.size()-sublen; ++i){size_t hashValue = hashfunc(i, i+sublen-1, m, num, str)%max;if(!hash[hashValue]){result++;hash[hashValue] = 1;}}cout << result << endl;delete[] hash;return 0;
}
POJ 1200 Crazy Search 查找有多少种不同的子串(hash)相关推荐
- poj 1200 Crazy Search
http://poj.org/problem?id=1200 字符串搜索,要将字符串之前搜索过的字符串用一个数来映射储存.这里的字符串长达16*10^6,所以不能hash储存,就连下标都不能存下来,所 ...
- POJ 1200 Crazy Search(RK)
题意 给定一个由NC个字母组成的字符串,求长度为N的不同子串的个数 思路: 由于只有NC个字母,可以将字母编号,0 - NC - 1,转换成数字,就可以将字符串表示成NC进制的数字,这样所有字串代表的 ...
- POJ 2785 有多少种4个数相加等于0的方案(二分查找 or hash)
文章目录 1.二分查找法 1.1 思路: 1.2 AC代码 2.hash查找法 2.1 思路: 2.2 Wrong Answer 代码 2.3 Time Limit Exceeded 代码 2.4 偷 ...
- [递归]一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
这题是用C写的~ 在牛客上半天找不着ACM模式,练习模式里只有核心代码模式 这样用C语言编译器就不能自定义函数啊,不鸡肋吗??? 解决方法:在核心代码模式下用C++编译器(反正C++完全兼容C的不是吗 ...
- TSP问题中:如果有n个顶点,那么一共有多少种不同的环游
如果有n个顶点,那么一共有多少种不同的环游? 答: (n−1)!2\frac{(n-1)!}{2}2(n−1)! 1.首先是全排列n!n!n!,然后由于 1,2,3,...,n 和 2,3,..., ...
- 【对讲机的那点事】玩无线电,你知道的天线有多少种?
无线电发射机输出的射频信号功率,通过馈线(电缆)输送到天线,由天线以电磁波形式辐射出去.电磁波到达接收地点后,由天线接下来(仅仅接收很小很小一部分功率),并通过馈线送到无线电接收机.可见,天线是发射和 ...
- 软件开发有多少种方式
软件开发有多少种方式: Build To Learn Build To Show Build To Serve Build To Win 其中Build To Win是我们所学习的构建之法中的核心思想 ...
- 正方形分成16份,将1到16填入其中。让行和列都是从大到小。问一共有多少种方法?...
看了到面试题: 将正方形分成16份,将1到16填入其中.让行和列都是从大到小.问一共有多少种方法? 此题 解法有: 1. 穷举,基本不用考虑 复杂度O(16!). 2. 枚举+剪枝 .代码如下:得到答 ...
- 1 2 5组合100,有多少种方法
问题描述:用随意多个1 2 5三个数字的组合,使其值为100,有多少种组合方法? 基础解法:穷举法,1穷举100次,2穷举50次,5穷举20次,这种方法总共穷举的次数为100*50*20=100 00 ...
最新文章
- 手动安装K8s第三节:etcd集群部署
- ipad编程软件python-iPad可用的软件编程软件有吗?
- python映射类型-python笔记-映射类型(字典)
- SpringBoot:解决日期转换问题和日期展示问题
- 传统输电线路巡检难?无人机这回立了大功!
- OJ 注意点及知识点总结
- [转]优秀的女孩是没有性生活的
- 祝贺!吴晟成为 Apache 软件基金会首位中国董事!
- redux-saga源码解析
- Oracle数据库学习笔记
- H5+CSS3移动商城界面.七天从零实战课程-会员_登录
- ffmpeg开发打印音视频meta信息
- 有台服务可以干哪些好玩的事
- 科比球衣退役仪式 | 科比演讲
- 在Centos7下捣鼓邮件发送软件sendmail与postfix
- 小猿日记 - 程序猿的日常日记(3)
- 七牛云测试域名过期失效后の自救指南
- C语言:二维数组:求平均数
- guava之EventBus
- 攻防世界Web练习区Writeup