http://acm.hdu.edu.cn/showproblem.php?pid=4821

题意:
给出一个字符串,现在问你可以找出多少个长度为M*L的子串,该子串被分成L个段,并且每个段的字符串都是不同的。

思路:

看BKDRHash看了半天,很神奇~。关于这个,大家可以看一下这篇博客http://blog.csdn.net/xu20082100226/article/details/52651072

先计算出整个串的哈希值,套用公式$Hash[i]=Hash[i+1]*SEED+(ss[i]-'a'+1)$,这里SEED一般就是取个素数,Hash[i]表示第i个字符到终点的哈希值。然后枚举起点,由于一开始已经计算出了整个串的哈希值,所以长度为L的字符串的哈希值可以很容易的求出。用map来映射不同值出现的次数,如果mp.size()==M的话,那就说明这个子串是符合条件的。具体的一些说明可以看代码。

需要注意的是,由于hash的计算最后会使值很大,所以这里数据类型可以用usigned long long,可以自动取模。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn = +; const int SEED = ; char s[maxn];
int M,L;
unsigned long long base[maxn];
unsigned long long Hash[maxn]; map<unsigned long long, int> mp; int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&M,&L))
{
scanf("%s",s);
int len=strlen(s);
base[]=;
for(int i=;i<=L;i++)
base[i]=base[i-]*SEED;
Hash[len]=;
for(int i=len-;i>=;i--)
Hash[i]=Hash[i+]*SEED+(s[i]-'a'+); int ans=;
for(int i=;i<L && i+M*L<len;i++) //枚举字符串的起点
{
mp.clear();
for(int j=i;j<i+M*L;j+=L)
{
mp[Hash[j]-Hash[j+L]*base[L]]++;
}
if(mp.size()==M) ans++; for(int j=i+M*L;j<=len-L;j+=L) //滑动窗口
{
mp[Hash[j-M*L]-Hash[j-M*L+L]*base[L]]--; //去掉最左边的那一段长度L的字符串
if(mp[Hash[j-M*L]-Hash[j-M*L+L]*base[L]]==) mp.erase(Hash[j-M*L]-Hash[j-M*L+L]*base[L]); //右边新加一段
mp[Hash[j]-Hash[j+L]*base[L]]++;
if(mp.size()==M) ans++;
}
}
printf("%d\n",ans);
}
return ;
}

HDU 4821 String(BKDRHash)的更多相关文章

  1. HDU 4821 String (HASH)

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

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

  3. HDU 4821 String(2013长春现场赛I题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4821 字符串题. 现场使用字符串HASH乱搞的. 枚举开头! #include <stdio.h ...

  4. HDU 5934 Bomb(炸弹)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  5. HDU 5734 Acperience(返虚入浑)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  6. HDU 5724 Chess(国际象棋)

    HDU 5724 Chess(国际象棋) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  7. HDU 5826 physics(物理)

     physics(物理) Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)   D ...

  8. HDU 5835 Danganronpa(弹丸论破)

     Danganronpa(弹丸论破) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  9. Swift2.0 中的String(三):类型转换

    本系列第三篇,String相关的类型转换.其他的几篇传送门(GitHub打不开链接的同学请自行把地址github改成gitcafe,或者直接去归档里找:-P): Swift2.0 中的String(一 ...

随机推荐

  1. Hue中hive(hive cli)查询结果中显示列名,不带表名

    hive cli中显示列名 进入hive cli后 set hive.cli.print.header=true; 之后出现列名,但是带了表名前缀,由于网上没找到资料,于是到官网肉眼扫描所有参数,总算 ...

  2. java == 与 equals 相同与不同点

    java中与很多有意思又值得深究的点. 写这篇文章呢,是由于在百度知道中看到一个问题:怎样比较两个对象是否相同.这又使我想到了另外一个问题,== 和 equals有什么不同?写了几行代码,看了几篇文章 ...

  3. Linux 进程管理 ps、top、pstree命令

    ps命令:查看系统中正在运行的进程 ps 是用来静态地查看系统中正在运行的进程的命令.不过这个命令有些特殊,它的部分选项不能加入"-",比如命令"ps aux" ...

  4. SQL 语法笔记

    ➪SQL ➪基本类型 char / varchar / int / smallint / numeric / real, double precision / float ➪数据定义 create t ...

  5. flask框架----上下文管理

    一.上下文管理相关知识点: a.类似于本地线程 创建Local类: { 线程或协程唯一标识: { 'stack':[request],'xxx':[session,] }, 线程或协程唯一标识: { ...

  6. 【react懒加载组件】--react-lazyload

    组件安装: npm install react-lazyload --save-dev 组件使用: //引入 import LazyLoad from 'react-lazyload'; //rend ...

  7. ES6知识整理(6)--Symbol函数

    (文章会同步到博客园,技术类文章还是该让搜索引擎察觉比较好) symbol是js的第7种数据类型: 7种分别是:undefined.null.boolean(布尔).string(字符串).numbe ...

  8. JDBC和servlet设计思路、DAO模式思路、MVC思路粗略总结

    #JDBC和Servlet联合起来使用的项目思路: 说明:建库,最好一开始设置utf8字符集 step1: 在数据库中建表 如   create table t_user{ ...... } step ...

  9. Docker学习笔记之编写 Docker Compose 项目

    0x00 概述 通过阅读之前的小节,相信大家对 Docker 在开发中的应用已经有了一定的了解.作为一款实用的软件,我们必须回归到实践中来,这样才能更好地理解 Docker 的实用逻辑和背后的原理.在 ...

  10. Solr导入MySQL数据之dataimport-handler

    Solr不借助手动JSolr编程情况下也可以将Mysql的数据导入到Solr中.实现方式是安装dataimport-Handler从关系数据库将数据导入到索引库. 1.向SolrCore中加入jar包 ...