HDU1686

题意:

找A串在B串中的出现次数(可重叠),可用KMP做,这里只提供哈希算法做的方法

题解:

先得到A串的hash值,然后在B中枚举起点,长度为lena的子串,检验hash值是否相同就可以了。

代码:

/*
-1 在ull里相当于2的六四次-2
ull炸了就当mod2e64
*/ #include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef unsigned long long ull;
const int blo=31;
const int maxn = 1e6+5;
ull xp[maxn],hash_1[maxn],hash_2[maxn];
void init()
{
xp[0]=1;
for(int i=1; i<maxn; i++)
xp[i]=xp[i-1]*blo;
}
ull get_hash(int i,int L,ull hash_[])//get_hash(i,L)可以得到从位置i开始的,长度为L的子串的hash值.
{
return hash_[i]-hash_[i+L]*xp[L];
}
int make_hash(char str[],ull hash_[])
{
int len=strlen(str);
hash_[len]=0;
for(int i=len-1; i>=0; i--)
{
hash_[i]=hash_[i+1]*blo+(str[i]-'A'+1);
//cout<<hash_[i]<<" ";
}
return len;
}
char str[maxn],str2[maxn];
int main()
{ init();
//printf("%d\n",31644418079342855-13357*xp[3]);
int t;
scanf("%d",&t);
while(t--)
{
int ans=0;
scanf("%s%s",str,str2);
int len1=make_hash(str,hash_1);
int len2=make_hash(str2,hash_2);
//printf("\n");
ull tmp=get_hash(0,len1,hash_1);
//cout<<tmp<<"****"<<xp[len1]<<endl;
for(int i=0; i<len2-len1+1; i++) //注意枚举时的边界问题
{
if(get_hash(i,len1,hash_2)==tmp)
ans++;
}
printf("%d\n",ans);
}
return 0;
}

POJ2774

题意:

求两个串的最长公共子串,另一种解法是后缀数组,这里只讲哈希算法求解过程

题解:

由于没有给定长度,要求长度,这时就要想是否具有二分的性质,发现答案是具有二分性质的,所以我们可以二分答案,然后把A串中所有出现过的hash值放进一个数组,sort一下,然后对于每个B串产生的hash用lower_bound查询是否出现过,若出现过则直接返回true.复杂度是o(len*log(len)*log(len))o(len∗log(len)∗log(len))。不能使用map,因为map的复杂度要多一个log

代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
using namespace std;
const int maxn=1e6+10;
const int blo=31;
typedef unsigned long long ull;
ull xp[maxn],hash_1[maxn],hash_2[maxn];
ull a[maxn];
int len1,len2;
void init()
{
xp[0]=1;
for(int i=1;i<maxn;++i)
{
xp[i]=xp[i-1]*blo;
}
}
ull Get_hash(int i,int len,ull hash_[])
{
return hash_[i]-hash_[i+len]*xp[len];
}
int Make_hash(char s[],ull hash_[])
{
int len=strlen(s);
hash_[len]=0;
for(int i=len-1;i>=0;--i)
{
hash_[i]=hash_[i+1]*blo+(s[i]-'A'+1);
}
return len;
}
char s1[maxn],s2[maxn];
int check(int x)
{
int cnt=0;
for(int i=0;i<len1-x+1;i++)
{
a[cnt++]=Get_hash(i,x,hash_1);
}
sort(a,a+cnt);
for(int i=0;i<len2-x+1;++i)
{
ull tmp=Get_hash(i,x,hash_2);
int pos=lower_bound(a,a+cnt,tmp)-a;
if(a[pos]==tmp) return 1;
}
return 0;
}
int main()
{
init();
while(~scanf("%s%s",s1,s2))
{
len1=Make_hash(s1,hash_1);
len2=Make_hash(s2,hash_2);
int l=0,r=min(len1,len2),mid,ans=0;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid))
{
ans=mid;
l=mid+1;
}
else r=mid-1;
}
printf("%d\n",ans);
}
return 0;
}

POJ3261

题意:

求字符串中至少出现过k次的最长子串。

题解:

这道题哈希做法和上一道题很相似,你只需要确定一个这个串的出现次数大于等于k,那么可以在用一个upper_bound()函数和一个lower_bound()来确定这个子串在主串中的出现次数

代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
using namespace std;
const int maxn=2e4+10;
const int blo=31;
typedef unsigned long long ull;
ull xp[maxn],hash_1[maxn];
ull a[maxn];
int n,k;
void init()
{
xp[0]=1;
for(int i=1;i<maxn;++i)
{
xp[i]=xp[i-1]*blo;
}
}
ull Get_hash(int i,int len,ull hash_[])
{
return hash_[i]-hash_[i+len]*xp[len];
}
void Make_hash(ull s[],ull hash_[])
{
hash_[n]=0;
for(int i=n-1;i>=0;--i)
{
hash_[i]=hash_[i+1]*blo+s[i];
}
//return len;
}
ull s[maxn];
int check(int x)
{
int cnt=0;
for(int i=0;i<n-x+1;i++)
{
a[cnt++]=Get_hash(i,x,hash_1);
}
sort(a,a+cnt);
for(int i=0;i<n-x+1;++i)
{
ull tmp=Get_hash(i,x,hash_1);
int pos=lower_bound(a,a+cnt,tmp)-a;
if(a[pos]==tmp)
{
int index=upper_bound(a,a+cnt,tmp)-a;
//printf("%d %d %d %d\n",pos,index,i,x);
if(index-pos>=k) //这里是大于等于号
return 1;
//else return 0;
}
}
return 0;
}
int main()
{ init();
while(~scanf("%d%d",&n,&k))
{
for(int i=0;i<n;++i)
scanf("%llu",&s[i]);
Make_hash(s,hash_1);
int l=0,r=n,mid,ans=0;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid))
{
ans=mid;
l=mid+1;
}
else r=mid-1;
}
printf("%d\n",ans);
}
return 0;
}

哈希算法解决:HDU1686 && POJ2774 && POJ3261的更多相关文章

  1. 一致性哈希算法-----> 解决memecache 服务器扩容后的数据丢失。

    1 基本场景 比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 ...

  2. 一致性哈希算法(Consistent Hashing) .

    应用场景 这里我先描述一个极其简单的业务场景:用4台Cache服务器缓存所有Object. 那么我将如何把一个Object映射至对应的Cache服务器呢?最简单的方法设置缓存规则:object.has ...

  3. 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据

    一致性哈希算法 摘自:http://blog.codinglabs.org/articles/consistent-hashing.html 算法简述 一致性哈希算法(Consistent Hashi ...

  4. _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决

    笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...

  5. R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(二,textreuse介绍)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 上一篇(R语言实现︱局部敏感哈希算法(LSH) ...

  6. 用哈希算法的思想解决排序和字符串去重问题,时间复杂度为O(N)

    第一个题目: int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N) 我们所知道的常规排序中,最优的解法也就是O(N* ...

  7. 五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...

  8. 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  9. 一致性哈希算法以及其PHP实现

    在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括:  轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...

随机推荐

  1. appium元素识别方式实战

    github代码::  https://github.com/w550856163/App_Demo.git  tag: V1.1 Appium Inspector定位工具界面介绍:  Selecte ...

  2. Java进阶专题(二十一) 消息中间件架构体系(3)-- Kafka研究

    前言 Kafka 是一款分布式消息发布和订阅系统,具有高性能.高吞吐量的特点而被广泛应用与大数据传输场景.它是由 LinkedIn 公司开发,使用 Scala 语言编写,之后成为 Apache 基金会 ...

  3. 深入理解Redis之简单动态字符串

    目录 SDS SDS与C字符串的区别 SDS获取字符串长度复杂度为O(1),C字符串为O(N) SDS杜绝了缓存区溢出 减少修改字符串时带来的内存重分配次数 二进制安全 Redis没有直接使用C语言传 ...

  4. ctfhub技能树—信息泄露—备份文件下载—.DS_Store

    打开靶机 查看页面信息 使用dirsearch进行扫描 访问该网页,下载文件 使用Linux系统打开文件 发现一个特殊文件,使用浏览器打开 拿到flag 二.使用Python-dsstore工具查看该 ...

  5. 解决ROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'creat table study_record( id int(11) not null

    之前一直用的好好的,突然就出现了这个错误: ERROR 1064 (42000): You have an error in your SQL syntax; check the manual tha ...

  6. SAP IDES登陆的short dump终于不见了

    还记得这个IDES登陆的shortdump吗今天对内核从701_rel 升级到721,发现登陆的错误没了,看来721_rel内核支持的操作系统和数据库更多了,兼容性也更好了.

  7. 误删除SAP ECC中的profile文件

    环境:ECC6.0 EHP4  FOR ORACLE ON WINDWS X64下 今天在RZ10配置系统参数文件的时候,不小心错删除了instance profile文件,这下惨了,这是操作系统层级 ...

  8. 阿里云镜像仓库镜像迁移至私有Harbor

    下载镜像同步工具 wget https://goodrain-delivery.oss-cn-hangzhou.aliyuncs.com/boe/image-syncer && chm ...

  9. rehash (重新散列)

    rehash - Redis 设计与实现 http://redisbook.com/preview/dict/rehashing.html

  10. 京东零售mockRpc实践

    https://mp.weixin.qq.com/s/A0T6ySub0DfQiXJAbWm2Qg jsf协议是基于tcp的而且对数据进行了序列化.加密等操作,直接截获的方式很难实现.最后决定注入自己 ...