联系: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】的更多相关文章

  1. HDU 4821 String (HASH)

    题意:给你一串字符串s,再给你两个数字m l,问你s中可以分出多少个长度为m*l的子串,并且子串分成m个长度为l的串每个都不完全相同 首先使用BKDRHash方法把每个长度为l的子串预处理成一个数字, ...

  2. HDOJ 4821 String

    串hash String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  3. HDU 4821 String 字符串hash

    String Problem Description   Given a string S and two integers L and M, we consider a substring of S ...

  4. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  5. Redis学习(4)-数据类型,string,hash

    Redis数据类型: redis使用键值对保存数据 key:全部是字符串 value:五种数据类型:string,hash,List,Set,有序的Set集合. key命名:自定义,名字不要过长,否则 ...

  6. Java中String的hash函数分析

    转载自:http://blog.csdn.net/hengyunabc/article/details/7198533 JDK6的源码: [java] view plaincopy /** * Ret ...

  7. redis存json数据时选择string还是hash

    redis存json数据时选择string还是hash 我们在缓存json数据到redis时经常会面临是选择string类型还是选择hash类型去存储.接下来我从占用空间和IO两方面来分析这两种类型的 ...

  8. 带你掌握Redis数据类型:string和Hash

    摘要:Redis中有五大数据类型,分别是String.List.Set.Hash和Zset. 本文分享自华为云社区<Redis的string类型常用命令解析>,作者:灰小猿 . 先问大家一 ...

  9. HDU 4821 String hash

    String Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  10. 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 ...

随机推荐

  1. 算法战斗:给定一个号码与通配符问号W,问号代表一个随机数字。 给定的整数,得到X,和W它具有相同的长度。 问:多少整数协议W的形式和的比率X大?

    如果说: 给定一个号码与通配符问号W,问号代表一个随机数字. 给定的整数,得到X,和W它具有相同的长度. 问:多少整数协议W的形式和的比率X大? 进格公式 数据的多组,两排各数据的,W,第二行是X.它 ...

  2. C# The process cannot access the file because it is being used by another process

    C# The process cannot access the file because it is being used by another process   The process cann ...

  3. 重新想象 Windows 8 Store Apps (29) - 图片处理

    原文:重新想象 Windows 8 Store Apps (29) - 图片处理 [源码下载] 重新想象 Windows 8 Store Apps (29) - 图片处理 作者:webabcd介绍重新 ...

  4. linux上安装配置vsftpd(转)

    转自:http://www.webarch.org/category/linux生产环境是Centos5.6,由于需要提供ftp服务,就找了一款比较小巧的ftp服务器端软件,vsftpd(vsftpd ...

  5. 【SICP读书笔记(二)】使用过程来黏合数据 —— 酷炫吊的消息传递机制

    首先,让我们来看几个内建函数 (cons x y),作用是把x和y绑定成一个序对 (car z),作用是提取z序对的第一个元素 (cdr z),作用是提取z序对的第二个元素 容易看出,这个东西有点类似 ...

  6. asp.net在用户控件中使用ClientScript

    在用户空间中调用ClientScript.RegisterClientScriptBlock方法 ClientScript的命名空间是System.Web.UI.Page,并且要实例化之后的Page才 ...

  7. 自动同步Android源代码的脚本(repo sync)

    #!/bin/bash echo "================start repo sync====================" repo sync -j5 ]; do ...

  8. Hadoop学问Eclipse构建Hadoop工程

    在此之前的基础Hadoop在官方文件HDFS.MapReduce架构.配置管理是学习,但是,一些地方的官方文件相当含糊的解释. 我们没有发挥人可以体验,某种官方文件似业务规则或要求,但是,真正的细节还 ...

  9. 用bat 删除当前文件夹下的某类文件

    @echo on for /r %%f in (*.pdb,*.xml) do del %%f 保存为bat文件执行!

  10. Spark里面:获取图Spark有多少行代码

    Spark1.0.0公布一个多月,有多少行代码就(Line of Code, LOC)? watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW56aHNvZn ...