hihocoder 1084 (哈希)
时间限制:4000ms单点时限:4000ms内存限制:256MB描述
你知道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
AC代码:
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; #define mem(a, b) (memset(a, b, sizeof(a)))
#define pb push_back
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define rep(i, m) for (int i = 0; i < (int)(m); i++)
#define rep2(i, n, m) for (int i = n; i < (int)(m); i++)
typedef unsigned long long ULL;
typedef pair<int, int> pii; const int oo = (int) 1e9;
const double PI = * acos();
const double eps = 1e-; const int P = ;
const int MAX_N = ;
ULL ha[MAX_N], hb[MAX_N];
ULL p[MAX_N]; ULL get(ULL h[], int l, int r) {
return h[r] - h[l] * p[r - l];
} char sa[MAX_N], sb[MAX_N];
int main(void) {
p[] = ;
for (int i = ; i < MAX_N; ++i)
p[i] = p[i - ] * P; while (~scanf("%s", sa + )) {
scanf("%s", sb + );
int k;
scanf("%d", &k); int lenA = strlen(sa + );
int lenB = strlen(sb + );
for (int i = ; i <= lenA; ++i) {
ha[i] = ha[i - ] * P + sa[i];
}
for (int i = ; i <= lenB; ++i) {
hb[i] = hb[i - ] * P + sb[i];
} int ans = ;
for (int i = lenB; i <= lenA; ++i) {
int cnt = ; int za = i, zb = lenB;
while ( ) {
int l = , r = zb + ;
while (r - l > ) {
int mid = (l + r) >> ;
if (get(ha, za - mid, za) == get(hb, zb-mid, zb)) {
l = mid;
} else {
r = mid;
}
}
//printf("l: %d\n", l);
if (l == zb) break;
za -= l + ;
zb -= l + ;
++cnt;
if (cnt > k) break;
if (zb <= ) break;
} if (cnt <= k) ++ans;
}
printf("%d\n", ans);
} return ;
}
hihocoder 1084 (哈希)的更多相关文章
- hihocoder 1084 扩展KMP && 2014 北京邀请赛 Justice String
hihocoder 1084 : http://hihocoder.com/problemset/problem/1084 北京邀请赛 Just String http://www.bnuoj.co ...
- 电子数字 网易游戏在线笔试 第一题 hihocoder
题目链接 http://hihocoder.com/contest/ntest2016spring1/problem/1 这个题目有几个算法考点: (1)对于一个LED数码管(由7个发光二极管封装在一 ...
- [PHP内核探索]PHP中的哈希表
在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- Java 哈希表运用-LeetCode 1 Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number. The ...
- 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希
据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...
- Oracle 哈希连接原理
<基于Oracle的sql优化>里关于哈希连接的原理介绍如下: 哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 在Oracle 7.3 ...
- SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)
今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...
- BZOJ 3555: [Ctsc2014]企鹅QQ [字符串哈希]【学习笔记】
3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2046 Solved: 749[Submit][Statu ...
随机推荐
- mysql索引原理深度解析
mysql索引原理深度解析 一.总结 一句话总结: mysql索引是b+树,因为b+树在范围查找.节点查找等方面优化 hash索引,完全平衡二叉树,b树等 1.数据库中最常见的慢查询优化方式是什么? ...
- JS 二维数组
给一个数组元素,赋一个数组的值,那么,这个数组就是“二维数组”. 二维数组,就得用两层循环来实现.也就是说循环套循环. 二维数组的循环,与二维表格的循环一模一样. 二维数组的访问:数组名后跟多个连续的 ...
- selenium基础(获取验证信息-断言)
获取验证信息 实际结果与预期结果进行比较称之为断言 通过获取title.URL.text等信息进行断言 text方法用于获取标签对之间的文本信息 from selenium import webdri ...
- Activiti添加批注(comment)信息
在每次提交任务的时候需要描述一些批注信息,例如:请假流程提交的时候要描述信息为什么请假,如果领导驳回可以批注驳回原因等 1.添加批注 // 由于流程用户上下文对象是线程独立的,所以要在需要的位置设置, ...
- php非法输入数据类型
1.空白输入 2.超长输入(如大于256个字符) 3.特殊字符(如·!@#¥%……&*()—=|.:‘:<>;'"<>?.,) 4.控制字符(如\r\n等) ...
- Linq学习笔记(第一部分)
本文分享自lliulun的30分钟linq教程,地址:http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html 一:与LINQ有关的语 ...
- matlab之原始处理图像几何变换
(一)图像几何变换理论知识 (1)图像的平移与比例 图像的平移很简单,平移前后的坐标分别为(x,y)和(x',y'),则满足的关系式为 x'= x +Tx: y'= y +Ty: 其中Tx与Ty分别为 ...
- AutoIt自动化编程(2)【转】
注意:窗口标题和窗口文本参数总是对大小写敏感的. 1.等待窗口系列命令/函数 AHK和AU3都提供了用法类似的一组窗口等待命令/函数:WinWait/WinWaitActive/WinWaitClos ...
- LoadRunner参数化详解【转】
距离上次使用loadrunner 已经有一年多的时间了.初做测试时在项目中用过,后面项目中用不到,自己把重点放在了工具之外的东西上,认为性能测试不仅仅是会用工具,最近又想有一把好的利器毕竟可以帮助自己 ...
- leetcode146周赛-1131-绝对值表达式的最大值
题目描述: class Solution: def maxAbsValExpr(self, arr1, arr2) -> int: def function(s1,s2): result1=[] ...