简单 hash 入门题目
题目描述
NOIP 复赛之前,HSD 桑进行了一项研究,发现人某条染色体上的一段 DNA 序列中连续的 kkk 个碱基组成的碱基序列与做题的 AC 率有关!于是他想研究一下这种关系。
现在给出一段 DNA 序列,请帮他求出这段 DNA 序列中所有连续 kkk 个碱基形成的碱基序列中,出现最多的一种的出现次数。
输入格式
两行,第一行为一段 DNA 序列,保证 DNA 序列合法,即只含有 A, G, C, T 四种碱基;
第二行为一个正整数 kkk,意义与题目描述相同。
输出格式
一行,一个正整数,为题目描述中所求答案。
样例
样例输入 1
AAAAA
1
样例输出 1
5
样例解释 1
对于这段 DNA 序列,连续的 111 个碱基组成的碱基序列只有 A,共出现 555 次,所以答案为 555。
样例输入 2
ACTCACTC
4
样例输出 2
2
样例解释 2
对于这段 DNA 序列,连续的 444 个碱基组成的碱基序列为:ACTC, CTCA, TCAC 与 CACT。其中 ACTC 出现 222 次,其余均出现 111 次,所以出现最多的次数为 222,即为答案。
数据范围与提示
记 DNA 序列长度为 nnn。
本题共 101010 组数据,只有输出与标准输出一致才可以获得该测试点的分数。
下面给出每组数据的范围和满足性质情况:
| 测试点编号 | nnn | kkk | 其他 |
|---|---|---|---|
| 111 | =105=10 ^5=105 | =1=1=1 | 满足性质 |
| 2,32,32,3 | ≤5×105\le 5 \times 10 ^5≤5×105 | =1=1=1 | - |
| 444 | ≤5×105\le 5 \times 10 ^5≤5×105 | ≤10\le 10≤10 | 满足性质 |
| 5,6,7,85,6,7,85,6,7,8 | ≤106\le 10 ^6≤106 | ≤10\le 10≤10 | - |
| 9,109,109,10 | =5×106=5 \times 10 ^6=5×106 | =10=10=10 | - |
性质:给出的 DNA 碱基序列中每个碱基均相同。
对于所有数据均保证 k≤nk\le nk≤n
思路分析 : hash 拉链即可解决
代码示例:
using namespace std;
#define ll unsigned long long
const ll maxn = 5e6+5;
const ll mm = 200007; char s[maxn];
ll k, len;
ll p = 19873;
ll hash_[maxn], pp[maxn]; void init_hash() {
hash_[0] = 0; pp[0] = 1;
for(ll i = 1; i <= len; i++) {
hash_[i] = hash_[i-1]*p + (s[i]-'a');
pp[i] = pp[i-1]*p;
}
}
struct node
{
ll x;
ll cnt = 0;
int next; //!!!
}arr[maxn];
int head[mm+50];
ll tot = 1; ll _max(ll a, ll b){
return a>b?a:b;
}
void solve() {
ll ans = 1;
memset(head, -1, sizeof(head));
for(ll i = k; i <= len; i++){
ll num = hash_[i]-hash_[i-k]*pp[k];
ll num2 = num%mm;
int f = head[num2];
int sign = 0;
while(f != -1) {
if (arr[f].x == num) {
arr[f].cnt++;
ans = _max(ans, arr[f].cnt);
sign = 1;
break;
}
f = arr[f].next;
}
if (sign) continue;
arr[tot].x = num;
arr[tot].cnt = 1;
arr[tot].next = head[num2];
head[num2] = tot++;
}
printf("%lld\n", ans);
} int main() { scanf("%s", s+1);
len = strlen(s+1);
scanf("%llu", &k);
init_hash();
solve();
return 0;
}
简单 hash 入门题目的更多相关文章
- Python简单的CTF题目hash碰撞小脚本
Python简单的CTF题目hash碰撞小脚本 import hashlib for num in range(10000,9999999999): res = hashlib.sha1(str(nu ...
- 树形DP入门题目推荐以及解析
关于树形DP几道入门题目 今天恶补树形DP,感觉海星. 其实挺简单的. 介绍几道例题,我会的. 1.洛谷P1352 没有上司的舞会 我的一篇题解 我们可以考虑每一个节点都是有两种情况. 一个是被邀请: ...
- Python简单爬虫入门三
我们继续研究BeautifulSoup分类打印输出 Python简单爬虫入门一 Python简单爬虫入门二 前两部主要讲述我们如何用BeautifulSoup怎去抓取网页信息以及获取相应的图片标题等信 ...
- Python简单爬虫入门二
接着上一次爬虫我们继续研究BeautifulSoup Python简单爬虫入门一 上一次我们爬虫我们已经成功的爬下了网页的源代码,那么这一次我们将继续来写怎么抓去具体想要的元素 首先回顾以下我们Bea ...
- GJM : Python简单爬虫入门(二) [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- DirectShow 最简单的入门 -- 播放一段视频
#include <dshow.h> #pragma comment(lib,"strmbase.lib") #pragma comment(lib,"qua ...
- HDOJ-ACM1425 sort 简单hash应用
其实快排也可以通过这个问题~不是考点 没想到考点是这个,简单hash应用,空间换时间 初始化一个长度为1000001的数组(由于数字的范围为[-500000,500000]) 如果存在这个数m,数组下 ...
- [LeetCode] 动态规划入门题目
最近接触了动态规划这个厉害的方法,还在慢慢地试着去了解这种思想,因此就在LeetCode上面找了几道比较简单的题目练了练手. 首先,动态规划是什么呢?很多人认为把它称作一种"算法" ...
- echarts之简单的入门——【二】再增加一个柱状图和图例组件
echarts之简单的入门——[一]做个带时间轴的柱状统计图 现在需求说,我需要知道日答题总次数和活跃人数,那么我们如何在上面的图表中增加一个柱状图呢? 如果你看过简单入门中的配置项手册中series ...
随机推荐
- 报错:org.springframework.beans.factory.BeanCreationException
报错码为以下内容,把自己走的坑贴出来,免得大家如同样的坑.以下解决方法仅供参考. ERROR [RMI TCP Connection(3)-127.0.0.1] - Context initializ ...
- H3C 什么是路由
- 11-28\enum
1.创建一个枚举对象,对象中4个属性video视频.book书----(这2个属性可以用数字表示). 2.创建一个class对象,对象中有2个属性,一个是id属性(自己设置),第二个属性是type类型 ...
- java编译器优化和运行期优化
概述 最近在看jvm优化,总结一下学习的相关知识 (一)javac编译器 编译过程 1.解析与填充符号表过程 1).词法.语法分析 词法分析将源代码的字符流转变为标记集合,单个字符是程序编 ...
- 关于electron中入口文件main.js一些重要参数(持续更新maybe)
const {app, BrowserWindow} = require('electron') const path = require('path') let mainWindow functio ...
- dotnet 获取用户设备安装了哪些 .NET Framework 框架
从注册表可以拿到当前用户安装的 .NET Framework 版本,本文告诉大家如何解析这些信息 在注册表的当前设备的 SOFTWARE\Microsoft\NET Framework Setup\N ...
- PowerShell 通过 WMI 获取系统服务
本文告诉大家如何通过 WMI 获取系统服务 通过 Win32_Service 可以获取系统启动的服务 Get-WmiObject Win32_Service | Format-List Caption ...
- python调用另一个文件中的代码,pycharm环境下:同文件夹下文件(.py)之间的调用,出现红线问题
如何调用另一个python文件中的代码无论我们选择用何种语言进行程序设计时,都不可能只有一个文件(除了“hello world”),通常情况下,我们都需要在一个文件中调用另外一个文件的函数呀数据等等, ...
- 2019牛客多校第二场 A Eddy Walker(概率推公式)
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
- c++ unordered_map 自定义key
C++11新增了一类散列容器包括unordered_set, unordered_map, unordered_multiset, unordered_multimap, 即之前熟悉的hash_set ...