[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算法积 ...
随机推荐
- 【SDOI 2016】 排列计数
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4517 [算法] 有m个数在原来的位置上,说明有(n-m)个数不再原来的位置上 那么, ...
- 7.matlab字符串分析
1 字符串处理函数 clc; clear all; str='My name is Robin.'; disp(str); %字符串的输出 str_size=size(str) %字符串的长度 str ...
- 三种启动SQLSERVER服务的方法(启动sqlserver服务器,先要启动sqlserver服务)
1.后台启动 计算机-管理-服务和应用程序 2.SQL SERVER配置管理器 3.在运行窗口中使用命令进行启动:
- EntityFramework使用及优化
1. 简介 ORM框架:Object Relation Mapping,用操作对象的方式来操作数据库 其它框架:Dapper.NHibernate,首推EF,微软官方的. EF底层还是ADO.NET实 ...
- SQL学习——小结练习(1)
到处淘来的SQL题 1. 用一条SQL 语句 查询出每门课都大于80 分的学生姓名 name kecheng fenshu 张三 语文 81张三 数学 ...
- indexOf实际试用方法
用于搜索和查找关键字个数或者位置 例如: package zifu; public class tianqi { public static void main (String args[]){ St ...
- 从DataTable高效率导出数据到Excel
首先从数据库读取数据到DataTable,这我就不提了,大家都明白.下面直接介绍如何从DataTable高效率导出数据到Excel中的方法,代码如下: using Microsoft.Office.I ...
- HDU 2300 Crashing Robots
Crashing Robots 题意 模拟多个机器人在四个方向的移动,检测crash robot, crash wall, OK这些状态 这是个模拟题需要注意几点: 理解转变方向后移动多少米,和转动方 ...
- BZOJ 5020 [THUWC2017]Drown in the math ocean (LCT+求导)
题目大意: 太长了略 洛谷题面传送门 嗯,数学题 感觉考试要是出这种题我就死翘翘了[逃 不用想都知道要$LCT$维护断边连边,但询问该如何处理呢 利用题目给出的公式 $f(x)=\sum_{i=0}^ ...
- springmvcjson中文乱码处理
在sping.xml中增加配置信息 <bean class="org.springframework.web.servlet.mvc.method.annotation.Request ...