HDU 4821 String(BKDRHash)
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)的更多相关文章
- HDU 4821 String (HASH)
题意:给你一串字符串s,再给你两个数字m l,问你s中可以分出多少个长度为m*l的子串,并且子串分成m个长度为l的串每个都不完全相同 首先使用BKDRHash方法把每个长度为l的子串预处理成一个数字, ...
- 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 ...
- HDU 4821 String(2013长春现场赛I题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4821 字符串题. 现场使用字符串HASH乱搞的. 枚举开头! #include <stdio.h ...
- HDU 5934 Bomb(炸弹)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 5734 Acperience(返虚入浑)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 5724 Chess(国际象棋)
HDU 5724 Chess(国际象棋) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- HDU 5826 physics(物理)
physics(物理) Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) D ...
- HDU 5835 Danganronpa(弹丸论破)
Danganronpa(弹丸论破) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- Swift2.0 中的String(三):类型转换
本系列第三篇,String相关的类型转换.其他的几篇传送门(GitHub打不开链接的同学请自行把地址github改成gitcafe,或者直接去归档里找:-P): Swift2.0 中的String(一 ...
随机推荐
- Hive 的排名和跨行 窗口函数及其使用
一.排序&去重分析 row_number() over(partititon by col1 order by col2) as rn 也可以用 row_number() over(distr ...
- sql之left join、right join、inner join的区别,连接自己时的查询结果测试
sql之left join.right join.inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括 ...
- 1、CentOS部署Java开发环境
一.安装jdk jdk下载地址:http://www.Oracle.com/technetwork/java/javase/downloads/jdk-6u31-download-1501634.h ...
- linux--- sort,uniq,cut,wc命令
1.sort [-fbMnrtuk] [file or stdin] -f :忽略大小写的差异,例如 A 与 a 视为编码相同: -b :忽略最前面的空格符部分: -M :以月份的名字来排序,例如 J ...
- 前端框架VUE----babel
这个是解析我们es6的代码的,为什么要用它呢,因为对于一些ie浏览器,甚至FF浏览器,低版本的还不能识别我们的es6代码,那么vue里面好多还让我们去写es6的代码,这个时候我们就可以用babel这个 ...
- 图片转化成base64字符串
package demo; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.*; public ...
- Kattis之旅——Fractional Lotion
Freddy practices various kinds of alternative medicine, such as homeopathy. This practice is based o ...
- Solr索引配置
Solr主配置文件 schema.xml,在SolrCore的conf目录下,它是Solr数据表配置文件,它定义了加入索引的数据的数据类型的.主要包括FieldTypes.Fields和其他的一些缺省 ...
- jbpm 6 vs activities 5评估(持续更新、亲测实际项目评估)
最近我们有个使用了jbpm 6.2(6.2是一个较大的里程碑)的批处理模块,因为大BOSS一直觉得太重了,希望有更加轻量级的解决方案,因为我们基本上没有真正意义上流程的概念,只有静态的流程图,因为一直 ...
- java中线程的停止以及LockSupport工具类
看jstack输出的时候,可以发现很多状态都是TIMED_WAITING(parking),如下所示: "http-bio-8080-exec-16" #70 daemon pri ...