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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金融行业如何用大数据构建精准用户画像?

原文地址&#xff1a;https://www.jianshu.com/p/6e0a0ca5948e 1. 什么是用户画像&#xff1f;2. 用户画像的四阶段用户画像的焦点工作就是为用户打“标签”&#xff0c;而一个标签通常是人为规定的高度精炼的特征标识&#xff0c;如年龄、性别、地域、用户偏好等&#xff0c;最…

最全BAT前端开发面试80题:算法+html+js+css!含答案大赠送!

最全前端开发面试题目&#xff1a;包含算法网络css面试jsh5面试题目&#xff0c;尾部有最全BAT前端面试经典77题和答案&#xff0c;想要的就快来领走吧~&#xff08;领取方式见文末&#xff09; 一、前端算法面试 1、基本排序的方式 冒泡、快排、桶排、堆排序、归并排序、插入…

超一流 | 从XLNet的多流机制看最新预训练模型的研究进展

关注小夕并星标&#xff0c;解锁自然语言处理搜索、推荐与算法岗求职秘籍文 | 老饕&#xff08;某厂研究员&#xff0c;祖传调参&#xff09;美 | 人美心细小谨思密达导读作为 NLP 近两年来的当红炸子鸡&#xff0c;以 ELMo/BERT 为代表的语言预训练技术相信大家已经很熟悉了。…

论文浅尝 | 神经网络与非神经网络简单知识问答方法的强基线分析

来源&#xff1a;NAACL 2018链接&#xff1a;http://aclweb.org/anthology/N18-2047本文关注任务为面向简单问题的知识库问答&#xff08;仅用KB中的一个事实就能回答问题&#xff09;。作者将任务划分为实体检测&#xff0c;实体链接&#xff0c;关系预测与证据整合&#xff0…

干货 | 搞定用户画像只需5个步骤

【转】http://www.sohu.com/a/115611583_445326有一句话是&#xff0c;千万人撩你&#xff0c;不如一人懂你&#xff0c;这句话在互联网圈可以说成是&#xff0c;真正的了解用户&#xff0c;才能得到用户&#xff0c;所以&#xff0c;用户画像的重要性不言而喻。什么是用户画像…

领域情报搜索实践:真实场景下的问答实施策略与风险分析

知识搜索&#xff0c;对于一个企业而言&#xff0c;目前无论是在对内管理还是对外服务的业务上&#xff0c;都有着大量的需求&#xff0c;并表现出急迫性的特征。 例如&#xff0c;很多企业都积累了大量的企业知识资产&#xff0c;并且规模以每年200%的速度增长&#xff0c;其…

数据结构--二叉树 Binary Tree

文章目录1.概念2.存储方式2.1 链式存储&#xff08;二叉树代码大部分是链式实现的&#xff09;2.2 顺序存储&#xff08;基于数组&#xff09;3.二叉树的遍历3.1 基于链表的二叉树实现代码3.2 基于数组的二叉树实现代码3.3 非递归法 二叉树遍历1.概念 二叉树&#xff0c;每个节…

算法工程师思维导图—数据结构与算法

卖萌屋的妹子们&#xff08;划掉&#xff09;作者团整理的算法工程师思维导图&#xff0c;求职/自我提升/查漏补缺神器。该手册一共分为数据结构与算法、数学基础、统计机器学习和深度学习四个部分。点击这里查看具体使用指南。该手册有两种获取方式&#xff1a;公众号后台回复…

通过预训练提升语言理解

官方地址&#xff1a;https://blog.openai.com/language-unsupervised/文章&#xff1a;https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf代码&#xff1a;https://github.com/openai/finetune-tran…

最全Java架构师130面试题:微服务、高并发、大数据、缓存等中间件

一、数据结构与算法基础 说一下几种常见的排序算法和分别的复杂度。 用Java写一个冒泡排序算法 描述一下链式存储结构。 如何遍历一棵二叉树&#xff1f; 倒排一个LinkedList。 用Java写一个递归遍历目录下面的所有文件。 二、Java基础 接口与抽象类的区别&#xf…

智能投顾全面解读

智能投顾全面解读 <p>传统投顾一直是与理财产品的销售紧密结合在一起的。投顾即销售&#xff0c;在国内理财界也是约定俗成的现实。<br></p><p>传统投资顾问即证券投资顾问业务遵循《证券投资顾问业务暂行规定》&#xff0c;开展证券投资顾问业务的机构…

数据结构--二叉查找树 Binary Search Tree

文章目录1.二叉查找树概念2.二叉查找树操作2.1 查找2.2 插入2.3 删除2.4 其他3. 支持重复数据的二叉查找树4 有散列表了&#xff0c;还需要二叉查找树&#xff1f;5 代码实现1.二叉查找树概念 二叉查找树要求&#xff0c;在树中的任意一个节点&#xff0c;其左子树中的每个节点…

最新蚂蚁金服Java面试题:Docker+秒杀设计+RocketMQ+亿级数据设计

蚂蚁金服一面&#xff1a; 1 自我介绍 2 讲一下ArrayList和linkedlist的区别&#xff0c;ArrayList的扩容方式&#xff0c;扩容时机。 3 hashmap的实现&#xff0c;以及hashmap扩容底层实现。 4 NIO了解么&#xff0c;讲一下和BIO的区别&#xff0c;AIO呢。阻塞&#xff0c;…

论文浅尝 | 常识用于回答生成式多跳问题

链接&#xff1a;https://arxiv.org/pdf/1809.06309.pdfAnsweringTasks多跳问题一般需要模型可以推理、聚合、同步上下文中不同的信息。就需要理解那些人类通过背景知识可以理解的限制关系。本文提出了一个很强的baseline模型&#xff08;multi-attention pointer-generator d…

中国智能投顾行业

原文地址&#xff1a; 中国智能投顾行业 一、概要 财富管理与新兴金融科技的结合&#xff0c;使得财富管理行业正在进入新的阶段——智能财富管理。近几年全球出现的智能投顾模式已然成为智能财富管理的一大热点。智能投顾&#xff0c;简而言之&#xff0c;就是基于投资者的投…

别让数据坑了你!用置信学习找出错误标注(附开源实现)

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | JayLou娄杰&#xff08;NLP算法工程师&#xff0c;信息抽取方向&#xff09;编 | 北大小才女小轶美 | Sonata1 前言在实际工作中&#xff0c;你是否遇到过这样一个问题或痛点&#xff1a;无论是通过哪种…

助力句子变换:35W抽象、43W同义、13W简称三大知识库对外开源

句子变换&#xff0c;是指根据给定中文句子&#xff0c;借助某种语言处理手段&#xff0c;扩展出一定数据规模的中文句子集合&#xff0c;是一个从1到N的过程&#xff0c;目的在于解决搜索&#xff08;查询扩展&#xff09;、分类&#xff08;样本扩充&#xff09;、抽取&#…

数据结构--红黑树 Red Black Tree

文章目录1.概念2.操作2.1 左旋、右旋&#xff08;围绕某个节点的左/右旋&#xff09;2.2 插入2.3 删除3. 代码1.概念 二叉树在频繁动态增删后&#xff0c;可能退化成链表&#xff0c;时间复杂度由 O(lgn) 变成 O(n)。&#xff08;不平衡&#xff09;平衡二叉树&#xff0c;树中…

深度学习在用户画像标签模型中的应用

原文地址&#xff1a;https://blog.csdn.net/chaishen10000/article/details/79324016 最近一段时间都在学习深度学习&#xff0c;想着在用户画像标签模型中看能不能用上&#xff0c;终于&#xff0c;用了一个多月的时间&#xff0c;结合实际的场景和数据&#xff0c;搭建了一套…

最强京东Java面试题(共现场4面)

一面&#xff08;基础面&#xff1a;约1个小时&#xff09; 自我介绍&#xff0c;主要讲讲做了什么和擅长什么 springmvc和spring-boot区别 Autowired的实现原理 Bean的默认作用范围是什么&#xff1f;其他的作用范围&#xff1f; 索引是什么概念有什么作用&#xff1f;MyS…