简单 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 ...
随机推荐
- java 两种进程创建方式比较
A extends Thread: 简单 不能再继承其他类了(Java单继承) 同份资源不共享 A implements Runnable:(推荐) 多个线程共享一个目标资源,适合多线程处理同一份资源 ...
- Vue 设置class样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 1119 机器人走方格 V2 (组合数学)
M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. Input 第1行,2个数M,N,中间用空格隔开 ...
- 2018-10-19-jekyll-添加-Valine-评论
title author date CreateTime categories jekyll 添加 Valine 评论 lindexi 2018-10-19 09:10:40 +0800 2018-2 ...
- jquery监听输入框只能输入数字
$('#mm').bind('input propertychange',function(){ var val= $(this).val(); if(val!=''&& isNaN( ...
- 递归&时间模块&os模块
递归 递归调用 一个函数,调用了自身,称为递归调用 递归函数:一个会调用自身的函数称为递归函数 凡是循环能干的事,递归都能干 方式: 写出临界条件 找这一次和上一次的关系 假设当前函数已经能用,调用自 ...
- es6笔记 day2---数组热闹的循环
数组: ES5里面新增一些东西 循环 : 1.for for(let i =0;i<arr.length;i++) 2.while arr.forEach() arr.map() arr.fil ...
- dotnet core 隐藏控制台
如果写一个控制台程序,需要隐藏这个控制台程序,可以使用本文的方法 如果是在 Windows 下运行, 可以使用一些系统提供的方法隐藏控制台.如果是 Linux 下,都是控制台,就不用隐藏了 复制下面的 ...
- 【35.53%】【POJ 2912】Rochambeau
Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2837 Accepted: 1008 Description N childre ...
- 一个APP从启动到主页面显示经历了哪些过程?
①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求: ②system_server进程接收到请求后,向zygote进程 ...