[TJOI2017] DNA 解题报告 (hash+二分)
题目链接:https://www.luogu.org/problemnew/show/P3763
题目大意:
给定原串S0,询问S0有多少个子串和给定串S相差不到3个字母
题解:
我们枚举S0的子串,问题转化为如何高效的判断两个串是否相差不到三个字母
考虑到数据范围,发现只能有log的时间余地
自然想到二分
solve每次找到第一个不同的位置并且返回,连续solve 4次,若S在这期间被处理完了,那么说明两个串相差不到3个字母
当然还有一些小细节
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
typedef unsigned long long ull;
const int N=1e5+;
int lena,lenb;
ull pin[N],haa[N],hab[N];
char a[N],b[N];
void H()
{
haa[]=hab[]=;
for (int i=;i<=lena;i++)
{
haa[i]=haa[i-]*+a[i]-'a';
}
for (int i=;i<=lenb;i++)
{
hab[i]=hab[i-]*+b[i]-'a';
}
}
int solve(int x,int y)
{
int l=,r=lenb;
while (l<r)
{
int mid=l+r>>;
if ((haa[x+mid-]-haa[x-]*pin[mid])==(hab[y+mid-]-hab[y-]*pin[mid]))
{
l=mid+;
}
else r=mid;
}
if (haa[x+l-]-haa[x-]*pin[l]!=hab[y+l-]-hab[y-]*pin[l])
{
return l;
}
else return l+;
}
int check(int x)
{
int now=,k;
for (int i=;i<=;i++)
{
k=solve(x,now);
//printf("%d %d %d\n",x,now,k);
x+=k;now+=k;
if (now>lenb) return ;
}
k=solve(x,now);
x+=k-;now+=k-;
if (now>=lenb) return ;
return ;
}
int main()
{
pin[]=;
for (int i=;i<=N;i++) pin[i]=pin[i-]*;
int T;
scanf("%d",&T);
while (T--)
{
scanf("%s",a+);
scanf("%s",b+);
lena=strlen(a+),lenb=strlen(b+);
H();
//printf("%d\n",solve(2,3));
int re=;
for (int i=;i<=lena-lenb+;i++)
{
if (check(i)) re++;
}
printf("%d\n",re);
}
return ;
}
[TJOI2017] DNA 解题报告 (hash+二分)的更多相关文章
- [JSOI2008] [BZOJ1567] Blue Mary的战役地图 解题报告 (hash)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1567 Description Blue Mary最近迷上了玩Starcraft(星际争霸 ...
- BZOJ 1044 木棍分割 解题报告(二分+DP)
来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...
- [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)
题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...
- [HEOI2016/TJOI2016] 排序 解题报告(二分答案/线段树分裂合并+set)
题目链接: https://www.luogu.org/problemnew/show/P2824 题目描述: 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在 ...
- [codeforces 852 D] Exploration Plan 解题报告 (二分+最大匹配)
题目链接:http://codeforces.com/problemset/problem/852/D 题目大意: 有V个点,N个队伍,E条边,经过每条边有个时间,告诉你初始N个队伍的位置,求至少有K ...
- POJ 2002 Squares 解题报告(哈希 开放寻址 & 链式)
经典好题. 题意是要我们找出所有的正方形.1000点,只有枚举咯. 如图,如果我们知道了正方形A,B的坐标,便可以推测出C,D两点的坐标.反之,遍历所有点作为A,B点,看C,D点是否存在.存在的话正方 ...
- 北大ACM试题分类+部分解题报告链接
转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...
- Codeforces Round 662 赛后解题报告(A-E2)
Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...
- LeetCode 1 Two Sum 解题报告
LeetCode 1 Two Sum 解题报告 偶然间听见leetcode这个平台,这里面题量也不是很多200多题,打算平时有空在研究生期间就刷完,跟跟多的练习算法的人进行交流思想,一定的ACM算法积 ...
随机推荐
- BigInteger类型转换成Long类型或int类型问题
BigInteger bi = new BigInteger("123"); int i = bi.intValue(); lo ...
- pyspider architecture--官方文档
原文地址:http://docs.pyspider.org/en/latest/Architecture/ Architecture This document describes the reaso ...
- MVC的一些常用特性,持续更新中。。。
1. @MvcHtmlString.Create("<option value='1'>火星</option>") //渲染Html
- jquery分页点击后页面置顶
前台: <a href="#" ><span id='top'></span></a> js中: 放在分页事件后,数据加载完成后 j ...
- POJ 3624 Charm Bracelet【01背包】
解题思路:直接套公式就能做的01背包, for(i=1;i<=n;i++) { for(v=w[i];v<=m;v++) f[i,v]=max(f[i,v],f[i-1,v-w[i]]+d ...
- 【转】javascript 小数乘法结果错误处理
一.用js计算 12.32 * 7 结果是多少? 答案:86.24000000000001 为什么会出现这种问题?怎么解决? js在处理小数的乘除法的时候有一个bug,解决的方法可以是:将小数变 ...
- ZBrush破解版下载,ZBrush中文版下载
11月11日这个令人兴奋的日子又来了.没错,“双十一”所有网购达人狂欢的日子.但是ZBrush却让心心念念的小伙伴们失望了一把,本以为双十一期间会有相关活动的,结果,官方并未提及,事实上,ZBrush ...
- ajax第一天总结
AJAX开发步骤 步一:创建AJAX异步对象,例如:createAJAX() 步二:准备发送异步请求,例如:ajax.open(method,url) 步三:如果是POST请求的话,一定要设置AJAX ...
- jq——属性和方法
ps:所有元素要加上“” 属性: 1) attr:属性,元素.attr(); 获取属性 $("input").click(function(){ console.log($( ...
- MySQL主从宕机的解决方法
测试系统:centos6.5系统 测试环境IP地址划分: master: 192.168.80.130 slave:192.168.80.143 slave:192.168.80.146 首先模拟(M ...