题目链接

时间限制: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 (哈希)的更多相关文章

  1. hihocoder 1084 扩展KMP && 2014 北京邀请赛 Justice String

    hihocoder 1084 : http://hihocoder.com/problemset/problem/1084 北京邀请赛 Just  String http://www.bnuoj.co ...

  2. 电子数字 网易游戏在线笔试 第一题 hihocoder

    题目链接 http://hihocoder.com/contest/ntest2016spring1/problem/1 这个题目有几个算法考点: (1)对于一个LED数码管(由7个发光二极管封装在一 ...

  3. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

  4. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  5. Java 哈希表运用-LeetCode 1 Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  6. 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希

    据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...

  7. Oracle 哈希连接原理

    <基于Oracle的sql优化>里关于哈希连接的原理介绍如下: 哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 在Oracle 7.3 ...

  8. SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)

    今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...

  9. BZOJ 3555: [Ctsc2014]企鹅QQ [字符串哈希]【学习笔记】

    3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2046  Solved: 749[Submit][Statu ...

随机推荐

  1. shiro框架的组成和内部结构(下一篇为spring整合shiro)

    1.shiro简介 Apache Shiro是Java的一个安全框架.功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案. ​ 实际上,Shir ...

  2. Mysq 列中存储json格式根据key取value

    SELECT DISTINCT (SUBSTRING_INDEX( REPLACE ( 列名称, CONCAT( SUBSTRING_INDEX( 列名称, '"key名称":', ...

  3. 关于InputMethodManager的使用方法

    InputMethodManager是一个用于控制显示或隐藏输入法面板的类(当然还有其他作用).获取InPutMethodManager的方法很简单. InputMethodManager imm = ...

  4. Codeforces-GYM101873 G Water Testing 皮克定理

    题意: 给定一个多边形,这个多边形的点都在格点上,问你这个多边形里面包含了几个格点. 题解: 对于格点多边形有一个非常有趣的定理: 多边形的面积S,内部的格点数a和边界上的格点数b,满足如下结论: 2 ...

  5. VI/VIM 无法使用系统剪贴板(clipboard)

    来自: http://www.bubuko.com/infodetail-469867.html vim 系统剪贴板 "+y 复制到系统剪切板 "+p 把系统粘贴板里的内容粘贴到v ...

  6. iOS开发系列-网络状态监控

    概述 在网络应用中,需要对用户设别的网络状态进行实时监控,可以让用户了解自己的网络状态出现网络问题提示用户. 一般在网络状态不好的场景下需要做一些处理比如: WIFT/3G/4G网络:自动下载高清图. ...

  7. Idea 2018.2.5创建springboot项目依赖包没有的错误

  8. LoadRunner穿过防火墙运行Vuser和进行监控

    LoadRunner穿过防火墙运行Vuser和进行监控   LoadRunner穿过防火墙进行测试,总结下来是2个方法:1. 在controller和Vuser的LAN中的防火墙都打开54345端口即 ...

  9. 廖雪峰Java13网络编程-1Socket编程-1网络编程概念

    1.计算机网络 1.1 什么是计算机网络? 两台或更多计算机组成的网络 同一网络内的任意2台计算机都可以直接通信 所有计算机必须遵循同一种网络协议 1.2 什么是互联网 互联网是网络的网络 互联网采用 ...

  10. &卡特兰数学习笔记

    一.关于卡特兰数 卡特兰数是一种经典的组合数,经常出现在各种计算中,其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 20801 ...