HihoCoder1084: 扩展KMP(二分+hash,求T串中S串的数量,可以失配一定次数)
描述
你知道KMP吗?它是用于判断一个字符串是否是另一个字符串的子串的算法。今天我们想去扩展它。
在信息理论中,在两个相同长度的字符串之间的海明码距离是:两个字符串相同位置对应的字符不同的位置数目。换种说法,它表示将一个字符串转化为另一个字符串所需要改变字符的最小数目。
下面这些字符串之间的海明码距离:
"karolin"和"kathrin"是3.
"karolin"和"kerstin"是3.
1011101和1001001是2.
2173896和2233796是3.
现在给定两个字符串stra,strb,和一个整数k。对于stra中的一个子串,如果它的长度和strb的相同且它们之间的海明码距离不超过k,我们认为它们是匹配的。
那么我们想知道在stra中有多少子串是和strb是匹配的。
输入
有多组测试(大约100),每个用例占3行。
第一行是stra。
第二行是strb。
第三行是k。
请处理到文件末尾。
【参数说明】
1<=stra,strb的长度<=100000
stra,strb只包含小写字母
0<=k<=5
输出
对于每个测试用例,以输出结果占一行。
- 样例输入
-
abcde
f
0
abcde
f
1
karolin
kathrin
3 - 样例输出
-
0
5
1
题意:求T串中S串的数量,最多可以失配K。
思路:len1=|S|,len2=|T|。枚举S的起点i,如果i后面的可行的长度>=len2,则累加1次。
具体实现:二分得到当前最长匹配长度,假设是L,则跳过L后面一位(失配的一位),同时失配次数累加一次,继续检测后面的。 如果匹配成功,而且跳过次数不超过K次,则满足。
Bkdrhash+二分: (题目是ExKMP,我没想到这么用扩展kmp来做,qwq。)
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define ull unsigned long long
const int maxn=;
const int seed=;
char a[maxn+],b[maxn+];
int hash1[maxn+],hash2[maxn+],g[maxn+],K;
int L1,L2,ans;
int find(int w,int v)
{
int L=,R=L2-v+,res=;
while(L<=R){
int Mid=(L+R)>>;
if(hash1[w+Mid-]-hash1[w-]*g[Mid]==hash2[v+Mid-]-hash2[v-]*g[Mid]) res=Mid,L=Mid+;
else R=Mid-;
} return res;
}
bool check(int x)
{
int w=x,v=;
for(int i=;i<=K;i++){
int L=find(w,v);
w=w+L+; v=v+L+;
if(v>L2) return true;
}
int L=find(w,v);
w=w+L; v=v+L;
if(v>L2) return true;
return false;
}
int main()
{
g[]=;
for(int i=;i<=maxn;i++) g[i]=g[i-]*seed;
while(~scanf("%s%s%d",a+,b+,&K)){
L1=strlen(a+); L2=strlen(b+); ans=;
for(int i=;i<=L1;i++) hash1[i]=hash1[i-]*seed+a[i];
for(int i=;i<=L2;i++) hash2[i]=hash2[i-]*seed+b[i];
for(int i=;i<=L1-L2+;i++)
if(check(i)) ans++;
printf("%d\n",ans);
}
return ;
}
HihoCoder1084: 扩展KMP(二分+hash,求T串中S串的数量,可以失配一定次数)的更多相关文章
- 【bzoj3796】Mushroom追妹纸 Kmp+二分+Hash
题目描述 给出字符串s1.s2.s3,找出一个字符串w,满足: 1.w是s1的子串: 2.w是s2的子串: 3.s3不是w的子串. 4.w的长度应尽可能大 求w的最大长度. 输入 输入有三行,第一行为 ...
- POJ 2774 Long Long Message (二分 + Hash 求最长公共子串)题解
题意:求最长公共子串 思路:把两个串Hash,然后我们把短的作为LCS的最大可能值,然后二分长度,每次判断这样二分可不可以.判断时,先拿出第一个母串所有len长的子串,排序,然后枚举第二个母串len长 ...
- Codeforces-914F Substrings in a String (Bitset求T串中S串出现次数)
之前有过区域赛,简化版问题: 给定一个小写字符组成的字符串S,(|S|<1e5,下标从1开始),现在有Q种操作,对于每个操作Q(Q<=1e5),输入opt, 如果opt==1,输入x,c, ...
- zoj3228 Searching the String AC自动机查询目标串中模式串出现次数(分可覆盖,不可覆盖两种情况)
/** 题目:zoj3228 Searching the String 链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=34 ...
- JS求任意字符串中出现最多的字符以及出现的次数
我爱撸码,撸码使我感到快乐!大家好,我是Counter本节讲讲如何利用JS来查找任意给定的字符串,求字符串中出现次数最多的字符,出现的次数.直接上代码了,该注释的都注释啦.非常轻松加愉快.效果如下: ...
- LOJ 2452 对称 Antisymmetry——用hash求回文串数
概念 用hash求最长回文串/回文串数 首先,易知,回文串具有单调性. 如果字符串 $s[l...r]$ 为回文串串,那么 $s[x...y]$($l < x, y < r$ 且 $|l- ...
- 字符串(扩展KMP):HDU 4333 Revolving Digits
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- A - A Secret -扩展KMP
题目大意: 给你两个字符串A,B,现在要你求B串的后缀在A串中出现的次数和后缀长度的乘积和为多少. 题解: 扩展KMP模板题,将A和B串都逆序以后就变成了求前缀的问题了,扩展KMP求处从i位置开始的最 ...
- A - A Secret (扩展kmp)
题目链接:https://cn.vjudge.net/contest/283743#problem/A 题目大意:给你字符串s1和s2,然后问你s2的每一个后缀在s1中出现的次数之和(可重叠). 具体 ...
随机推荐
- android实现通知栏消息
一.原理 消息推送有两种,一种是客户端定时直接到服务器搜索消息,如果发现有新的消息,就获取消息下来:另一种是服务器向客户端发送消息,也就是当有信息消息时,服务器端就会向客户端发送消息. 二.步骤(代码 ...
- mac 获得进程信息的方法
NSProcessInfo可以获得当前进程的信息.获得所有活动进程信息可以尝试使用下面的方法. 进程的信息可以通过ps命令得到也可以通过sysctl方法得到. 但是我总是不能获取进程的流量信息,关于这 ...
- IOC基本理解
什么是IOC? IOC全称为控制反转(Inversion Of Control),别名依赖注入(Dependency Injection). 控制反转即指我们获取依赖的方式发生了反转. 假设存在如下情 ...
- RabbitMQ核心组件及应用场景
一.适用场景 1.解耦 2.最终一致性 3.广播 4.错峰与流控(秒杀业务用于流量削峰场景) 秒杀场景 二.核心组件,关键点(交换器.队列.绑定) AMPQ消息路由必要三部分:交换器.队列.绑定. J ...
- Maven插件开发教程收集(待实践)
官方教程:http://maven.apache.org/plugin-developers/index.html http://blog.csdn.net/csfreebird/article/de ...
- android应用开发之View的大小计量单位(px、dpi、dp、dip、sp)
http://blog.csdn.net/ljianhui/article/details/43601495?ref=myread 一.像素(px)与屏幕分辨率 1)px(Pixels ,像素):对应 ...
- HDU 4902 Nice boat 线段树+离线
据说暴力也过了.还傻逼地写了这么长. . . #include <stdio.h> #include <string.h> #include <math.h> #i ...
- AngularJs概述
- Indri和Terrier搜索引擎的使用
介绍 Indri和Terrier都是开源的搜索引擎,当中Indri作为Lemur项目的一个重要部分,具有强大的查询接口,易建索引,可扩展,高效率等长处.能够在SourceForge Lemur Pro ...
- 令人赞叹的 MySQL
原文链接 译文链接 感谢 艾凌风 小伙伴校稿 令人赞叹的 MySQL 一个很棒的 MySQL 软件.库以及资源列表. 这个列表接受并鼓舞 pull requests,请看 CONTRIBUTING 文 ...