题目链接: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+二分)的更多相关文章

  1. [JSOI2008] [BZOJ1567] Blue Mary的战役地图 解题报告 (hash)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1567 Description Blue Mary最近迷上了玩Starcraft(星际争霸 ...

  2. BZOJ 1044 木棍分割 解题报告(二分+DP)

    来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...

  3. [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)

    题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...

  4. [HEOI2016/TJOI2016] 排序 解题报告(二分答案/线段树分裂合并+set)

    题目链接: https://www.luogu.org/problemnew/show/P2824 题目描述: 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在 ...

  5. [codeforces 852 D] Exploration Plan 解题报告 (二分+最大匹配)

    题目链接:http://codeforces.com/problemset/problem/852/D 题目大意: 有V个点,N个队伍,E条边,经过每条边有个时间,告诉你初始N个队伍的位置,求至少有K ...

  6. POJ 2002 Squares 解题报告(哈希 开放寻址 & 链式)

    经典好题. 题意是要我们找出所有的正方形.1000点,只有枚举咯. 如图,如果我们知道了正方形A,B的坐标,便可以推测出C,D两点的坐标.反之,遍历所有点作为A,B点,看C,D点是否存在.存在的话正方 ...

  7. 北大ACM试题分类+部分解题报告链接

    转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...

  8. Codeforces Round 662 赛后解题报告(A-E2)

    Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...

  9. LeetCode 1 Two Sum 解题报告

    LeetCode 1 Two Sum 解题报告 偶然间听见leetcode这个平台,这里面题量也不是很多200多题,打算平时有空在研究生期间就刷完,跟跟多的练习算法的人进行交流思想,一定的ACM算法积 ...

随机推荐

  1. 【SDOI 2016】 排列计数

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4517 [算法] 有m个数在原来的位置上,说明有(n-m)个数不再原来的位置上 那么, ...

  2. 7.matlab字符串分析

    1 字符串处理函数 clc; clear all; str='My name is Robin.'; disp(str); %字符串的输出 str_size=size(str) %字符串的长度 str ...

  3. 三种启动SQLSERVER服务的方法(启动sqlserver服务器,先要启动sqlserver服务)

    1.后台启动 计算机-管理-服务和应用程序 2.SQL SERVER配置管理器 3.在运行窗口中使用命令进行启动:

  4. EntityFramework使用及优化

    1. 简介 ORM框架:Object Relation Mapping,用操作对象的方式来操作数据库 其它框架:Dapper.NHibernate,首推EF,微软官方的. EF底层还是ADO.NET实 ...

  5. SQL学习——小结练习(1)

    到处淘来的SQL题 1. 用一条SQL 语句 查询出每门课都大于80 分的学生姓名 name   kecheng   fenshu 张三     语文       81张三     数学       ...

  6. indexOf实际试用方法

    用于搜索和查找关键字个数或者位置 例如: package zifu; public class tianqi { public static void main (String args[]){ St ...

  7. 从DataTable高效率导出数据到Excel

    首先从数据库读取数据到DataTable,这我就不提了,大家都明白.下面直接介绍如何从DataTable高效率导出数据到Excel中的方法,代码如下: using Microsoft.Office.I ...

  8. HDU 2300 Crashing Robots

    Crashing Robots 题意 模拟多个机器人在四个方向的移动,检测crash robot, crash wall, OK这些状态 这是个模拟题需要注意几点: 理解转变方向后移动多少米,和转动方 ...

  9. BZOJ 5020 [THUWC2017]Drown in the math ocean (LCT+求导)

    题目大意: 太长了略 洛谷题面传送门 嗯,数学题 感觉考试要是出这种题我就死翘翘了[逃 不用想都知道要$LCT$维护断边连边,但询问该如何处理呢 利用题目给出的公式 $f(x)=\sum_{i=0}^ ...

  10. springmvcjson中文乱码处理

    在sping.xml中增加配置信息 <bean class="org.springframework.web.servlet.mvc.method.annotation.Request ...