BZOJ_4892_[Tjoi2017]dna_哈希

Description

加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的
性状,但是研究人员发现对碱基序列S,任意修改其中不超过3个碱基,依然能够表现出吃藕的性状。现在研究人员
想知道这个基因在DNA链S0上的位置。所以你需要统计在一个表现出吃藕性状的人的DNA序列S0上,有多少个连续子
串可能是该基因,即有多少个S0的连续子串修改小于等于三个字母能够变成S。

Input

第一行有一个数T,表示有几组数据 每组数据第一行一个长度不超过10^5的碱基序列S0
每组数据第二行一个长度不超过10^5的吃藕基因序列S

Output

共T行,第i行表示第i组数据中,在S0中有多少个与S等长的连续子串可能是表现吃藕性状的碱基序列

Sample Input

1
ATCGCCCTA
CTTCA

Sample Output

2
 
分析:
枚举S0中每个与S等长的子串。我们求三次S和当前子串的lcp(最长公共前缀)来确定S0是否能够修改小于等于3个字母变成S。
lcp求法:二分加哈希
 
代码:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. #define N 100050
  6. #define LL unsigned long long
  7. int T, l1, l2;
  8. char s1[N], s2[N];
  9. LL mi[N], p = 19260817, h1[N], h2[N];
  10. bool check(int x) {
  11. int i = x, j = 1;
  12. int l = 1, r = l2 + 1, mid;
  13. for(int k = 1;k <= 3; ++ k) {
  14. while(l < r) {
  15. mid = (l + r) >> 1;
  16. if(h1[i + mid - 1] - h1[i - 1] * mi[mid] == h2[j + mid - 1] - h2[j - 1] * mi[mid]) l = mid + 1;
  17. else r = mid;
  18. }
  19. i = i + l; j = j + l;
  20. l = 1, r = l2 - j + 2;
  21. if(j > l2) return 1;
  22. mid = l2 - j + 1;
  23. if(h1[i + mid - 1] - h1[i - 1] * mi[mid] == h2[j + mid - 1] - h2[j - 1] * mi[mid]) return 1;
  24. }
  25. return 0;
  26. }
  27. int main() {
  28. scanf("%d", &T);
  29. while(T -- ) {
  30. int i, ans = 0;
  31. scanf("%s%s", s1 + 1, s2 + 1);
  32. l1 = strlen(s1 + 1);
  33. l2 = strlen(s2 + 1);
  34. if(l1 < l2) {
  35. puts("0"); continue;
  36. }
  37. mi[0] = 1;
  38. for(i = 1;i <= l1; ++ i) {
  39. mi[i] = mi[i - 1] * p;
  40. h1[i] = h1[i - 1] * p + s1[i];
  41. }
  42. for(i = 1;i <= l2; ++ i) h2[i] = h2[i - 1] * p + s2[i];
  43. for(i = 1;i <= l1 - l2 + 1; ++ i) {
  44. if(check(i)) ans++;
  45. }
  46. printf("%d\n", ans);
  47. }
  48. }
 

BZOJ_4892_[Tjoi2017]dna_哈希的更多相关文章

  1. BZOJ 4892 [Tjoi2017]dna 哈希+二分

    自己简直是傻死了...对于位置想错了... 二分出来的是LCP长度$+1$,即每一次二分出来的最后一个点都是失配的,而就算失配也会跳过这个点:所以当$k<=3$且模式串$s2$的指针$>l ...

  2. [TJOI2017]DNA --- 后缀数组

    [TJOI2017]DNA 题目描述 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S, 有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列S,任意修改其中不超过3个 ...

  3. [洛谷P3763] [TJOI2017]DNA

    洛谷题目链接:[TJOI2017]DNA 题目描述 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列S,任意修改其 ...

  4. 学习笔记-Rabin-Karp哈希

    在数学一本通上看过这两人名字,现在又出现了... 思想: 用一个整数表示一个字符串 \(w_{str}\)=(\(a_0\) \(p^{n-1}\)+\(a_1\) \(p^{n-2}\)+...+\ ...

  5. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

  6. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  7. Java 哈希表运用-LeetCode 1 Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  8. 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希

    据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...

  9. Oracle 哈希连接原理

    <基于Oracle的sql优化>里关于哈希连接的原理介绍如下: 哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 在Oracle 7.3 ...

随机推荐

  1. javascript—Mach的一些常用方法

    1.Math.random():返回 0 ~ 1 之间的随机数.   2.Math.round():四舍五入取整. 3.Math.ceil():向上取整;    例如:a=1.2,b=5.8;     ...

  2. Spring的事务 之 9.4 声明式事务 ——跟我学spring3

    9.4  声明式事务 9.4.1  声明式事务概述 从上节编程式实现事务管理可以深刻体会到编程式事务的痛苦,即使通过代理配置方式也是不小的工作量. 本节将介绍声明式事务支持,使用该方式后最大的获益是简 ...

  3. 如何写jquery插件

      首页    新文章  联系  管理  订阅  自己写一个 jQuery 插件 我知道这一天终将会到来,现在,它来了. 需求 开发 SharePoint 的 CSOM 应用时,经常需要在网页上输出一 ...

  4. Liunx权限修改命令

    语法: chmod  数值  文件名 例: chmod 644 mm.txt 命令执行后,文件mm.txt的权限值为 rw-r--r-- 详解:       权限分为 读.写.执行三种,分别用字母  ...

  5. Resin文档阅读笔记

    阅读文档对应的版本为Resin4.0,且基本只关注Standard版本的功能. 1.Resin可以注册为服务: To install the service, use C:/> resin-3. ...

  6. 修改input获取焦点背景黄色

    input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px white inset !important; }

  7. 遍历php数组的几种方法

    第一.foreach() foreach()是一个用来遍历数组中数据的最简单有效的方法. <?php $urls= array('aaa','bbb','ccc','ddd'); foreach ...

  8. angular2 安装 打包成发布项目过程

    安装之前要有typings和typescript全局已经安装好 安装命令新版为npm install -g @angular/cli 原来的angular-cli为老版的,我安装失败了 安装之后新建一 ...

  9. cocos2d-x高级学习

    弱联网开发技术: libcurl 添加lib文件:libcurl_imp.lib  pthreadVCE2.lib 添加头文件:#include"curl/curl.h" curl ...

  10. 阿里Java架构师谈谈架构和如何成为一个Java架构师

    架构的定义 我们来看看软件架构的一般定义: 程序和计算系统软件体系结构是指系统的一个或多个结构. 该结构包括软件的构建,构建的外部可见属性以及它们之间的相互关系. 该体系结构不是可操作的软件. 具体来 ...