HDOJ--4821--String【弦hash】
联系:http://acm.hdu.edu.cn/showproblem.php?pid=4821
题意:给一个字符串,选m个长度为l的子串组成新的串。要求这m个子串互不同样,问有多少种组合。
字符串hash题目,曾经没做过,做这道之前还用bkdrhash做了两道简单的题目。POJ1200和HDU1800。
用base数组记录乘了几个seed,base[i]表示seed^i,这个数组在之后计算子串hash值的时候会用到,先预处理一遍节省时间。
假设字符串从前往后hash。则hash[ i ] - hash[ i - l ] * base[ l ] 就是子串 [ i - l , i ] 的hash值,而从后往前hash的话 hash[ i ] - hash[ i + l ] * base[ l ] 就是子串 [ i , i + l ] 的hash值。
推导过程:以从前往后hash为例。如果字符串abab,子串长度2。则
i = 4时的hash值( ( ( (0+a)*seed+b ) * seed +a ) * seed + b ) ,
i - l = 2的hash值( (0+a)*seed+b )。乘base[2]之后 ( ( ( (0+a)*seed+b ) * seed ) * seed )
二者相减为a * seed + b。就是区间 [ i - l, i ] 相应字母 ab 的hash值。
之后依照每一点枚举m个l长度的子串,当他们hash值不同一时候就是一个结果。
#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 100010
#define eps 1e-7
#define INF 0x7FFFFFFF
#define seed 131
typedef long long ll;
typedef unsigned long long ull; char s[MAXN];
ull base[MAXN],Hash[MAXN];
map<ull,int> mp;
int main(){
int m,l,i,len,ans;
base[0] = 1;
for(i=1;i<MAXN;i++) base[i] = base[i-1] * seed;
while(scanf("%d%d",&m,&l)!=EOF){
scanf("%s",s);
ans = 0;
len = strlen(s);
Hash[len] = 0;
for(i=len-1;i>=0;i--){
Hash[i] = Hash[i+1] * seed + s[i] - 'a';
}
for(i=0;i<l&&i+m*l<len;i++){
mp.clear();
for(int j=i;j<i+m*l;j+=l){
ull temp = Hash[j] - Hash[j+l] * base[l];
mp[temp]++;
}
if(mp.size()==m) ans++;
for(int j=i+m*l;j+l<=len;j+=l){
ull temp = Hash[j-m*l] - Hash[j-(m-1)*l] * base[l];
mp[temp]--;
if(!mp[temp]) mp.erase(temp);
temp = Hash[j] - Hash[j+l] * base[l];
mp[temp]++;
if(mp.size()==m) ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
HDOJ--4821--String【弦hash】的更多相关文章
- HDU 4821 String (HASH)
题意:给你一串字符串s,再给你两个数字m l,问你s中可以分出多少个长度为m*l的子串,并且子串分成m个长度为l的串每个都不完全相同 首先使用BKDRHash方法把每个长度为l的子串预处理成一个数字, ...
- HDOJ 4821 String
串hash String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- HDU 4821 String 字符串hash
String Problem Description Given a string S and two integers L and M, we consider a substring of S ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
- Redis学习(4)-数据类型,string,hash
Redis数据类型: redis使用键值对保存数据 key:全部是字符串 value:五种数据类型:string,hash,List,Set,有序的Set集合. key命名:自定义,名字不要过长,否则 ...
- Java中String的hash函数分析
转载自:http://blog.csdn.net/hengyunabc/article/details/7198533 JDK6的源码: [java] view plaincopy /** * Ret ...
- redis存json数据时选择string还是hash
redis存json数据时选择string还是hash 我们在缓存json数据到redis时经常会面临是选择string类型还是选择hash类型去存储.接下来我从占用空间和IO两方面来分析这两种类型的 ...
- 带你掌握Redis数据类型:string和Hash
摘要:Redis中有五大数据类型,分别是String.List.Set.Hash和Zset. 本文分享自华为云社区<Redis的string类型常用命令解析>,作者:灰小猿 . 先问大家一 ...
- HDU 4821 String hash
String Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDU - 4821 String(窗口移动+map去重+hash优化)
String Given a string S and two integers L and M, we consider a substring of S as “recoverable” if a ...
随机推荐
- SQL之性能优化
在实际应用中.数据库中的数据会有非常多.若要从这些数据表中检索数据,就须要对系统进行优化,提高数据库系统的响应速度,以下就是日常一些查询优化的方法. 1.创建索引 索引能够提高数据库查询的速度, ...
- Oracle 阅读器-刚看完表空间回复的详细解释
(一) 当使用一个控制文件的备份恢复,例如下面的附图.使用备份控制文件恢复位置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGVtb25zb24=/fo ...
- js淡入淡出
示例: js淡入淡出 原理:更改css不透明数值 知识点: css不透明 filter:alpha(opacity:30); opacity:0.3;} 小技巧: 小于临界值,做加速 大于临界值,做减 ...
- Directx11学习笔记【十六】 光照模型的实现
本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5579289.html 在之前的场景绘制中我们都是给每个顶点指定了单 ...
- WebService 简单安全验证
原文:WebService 简单安全验证 最近新接了一个需要调用第三方WebService的项目,看到这个第三方WebService被调用的时候,需要授权用户名和密码,于是自己也想对WebServic ...
- 部署Redis主-从
Redis主-从部署实践 0. 前言 这篇文章简要介绍Redis的主从部署,实现了一主二从,使用两个哨兵监控,以实现简单的HA,其中从库作为备机. 1. 部署 这里有三台服务器,其中239主机上的Re ...
- Storm基础知识
上一篇文章我们介绍一个简单的Storm起源,今天我去学习Storm一些主要的知识,他的基本使用基本的了解.幸运的是,,不是太困难,假设我们理解Hadoop的MapReduce模型的话.看这个也是很类似 ...
- 第三篇——第二部分——第六文 监控SQL Server镜像
原文:第三篇--第二部分--第六文 监控SQL Server镜像 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26846203 要优化, ...
- 复制(1)——SQLServer 复制简介
原文:复制(1)--SQLServer 复制简介 前言: SQLServer的复制技术最少从SQLServer2000时代已经出现,当初是为了分布式计算,不是为了高可用.但是到了今天,复制也成为了一种 ...
- PoolBoy
PoolBoy source code : https://github.com/devinus/poolboy Checkout ready({checkout, Block, Timeout}, ...