文章目录

  • 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)相关推荐

  1. poj 1200 Crazy Search

    http://poj.org/problem?id=1200 字符串搜索,要将字符串之前搜索过的字符串用一个数来映射储存.这里的字符串长达16*10^6,所以不能hash储存,就连下标都不能存下来,所 ...

  2. POJ 1200 Crazy Search(RK)

    题意 给定一个由NC个字母组成的字符串,求长度为N的不同子串的个数 思路: 由于只有NC个字母,可以将字母编号,0 - NC - 1,转换成数字,就可以将字符串表示成NC进制的数字,这样所有字串代表的 ...

  3. 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 偷 ...

  4. [递归]一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

    这题是用C写的~ 在牛客上半天找不着ACM模式,练习模式里只有核心代码模式 这样用C语言编译器就不能自定义函数啊,不鸡肋吗??? 解决方法:在核心代码模式下用C++编译器(反正C++完全兼容C的不是吗 ...

  5. TSP问题中:如果有n个顶点,那么一共有多少种不同的环游

    如果有n个顶点,那么一共有多少种不同的环游? 答: (n−1)!2\frac{(n-1)!}{2}2(n−1)!​ 1.首先是全排列n!n!n!,然后由于 1,2,3,...,n 和 2,3,..., ...

  6. 【对讲机的那点事】玩无线电,你知道的天线有多少种?

    无线电发射机输出的射频信号功率,通过馈线(电缆)输送到天线,由天线以电磁波形式辐射出去.电磁波到达接收地点后,由天线接下来(仅仅接收很小很小一部分功率),并通过馈线送到无线电接收机.可见,天线是发射和 ...

  7. 软件开发有多少种方式

    软件开发有多少种方式: Build To Learn Build To Show Build To Serve Build To Win 其中Build To Win是我们所学习的构建之法中的核心思想 ...

  8. 正方形分成16份,将1到16填入其中。让行和列都是从大到小。问一共有多少种方法?...

    看了到面试题: 将正方形分成16份,将1到16填入其中.让行和列都是从大到小.问一共有多少种方法? 此题 解法有: 1. 穷举,基本不用考虑 复杂度O(16!). 2. 枚举+剪枝 .代码如下:得到答 ...

  9. 1 2 5组合100,有多少种方法

    问题描述:用随意多个1 2 5三个数字的组合,使其值为100,有多少种组合方法? 基础解法:穷举法,1穷举100次,2穷举50次,5穷举20次,这种方法总共穷举的次数为100*50*20=100 00 ...

最新文章

  1. 手动安装K8s第三节:etcd集群部署
  2. ipad编程软件python-iPad可用的软件编程软件有吗?
  3. python映射类型-python笔记-映射类型(字典)
  4. SpringBoot:解决日期转换问题和日期展示问题
  5. 传统输电线路巡检难?无人机这回立了大功!
  6. OJ 注意点及知识点总结
  7. [转]优秀的女孩是没有性生活的
  8. 祝贺!吴晟成为 Apache 软件基金会首位中国董事!
  9. redux-saga源码解析
  10. Oracle数据库学习笔记
  11. H5+CSS3移动商城界面.七天从零实战课程-会员_登录
  12. ffmpeg开发打印音视频meta信息
  13. 有台服务可以干哪些好玩的事
  14. 科比球衣退役仪式 | 科比演讲
  15. 在Centos7下捣鼓邮件发送软件sendmail与postfix
  16. 小猿日记 - 程序猿的日常日记(3)
  17. 七牛云测试域名过期失效后の自救指南
  18. C语言:二维数组:求平均数
  19. guava之EventBus
  20. 攻防世界Web练习区Writeup

热门文章

  1. Perforce使用指南_forP4V
  2. Jackson动态处理返回字段
  3. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-11项目日志解决方案
  4. 深度点评五种常见WiFi搭建方案
  5. Python实现比较两个列表(list)范围
  6. 王译潇20162314 第九周作业总结
  7. 教你遇事最有水平的处理方法
  8. C#整理1——进制转换
  9. wdcp-apache开启KeepAlive提高响应速度
  10. 详解AST抽象语法树