联系: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;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

转载于:https://www.cnblogs.com/bhlsheji/p/4854497.html

HDOJ--4821--String【弦hash】相关推荐

  1. string类型比较_redis存json数据时选择string还是hash

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

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

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

  3. HDU - 4821 String(字符串哈希+优化)

    题目链接:点击查看 题目大意:给出一个m和l,还有一个字符串,问在s中所有长度为m*l的连续子字符串中,有多少个满足条件的子字符串 这里的满足条件指的是,长度为m*l的子字符串,可以分成m个长度为l的 ...

  4. python redis list_Python操作redis实例小结【String、Hash、List、Set等】

    本文实例总结了Python操作redis方法.分享给大家供大家参考,具体如下: 这里介绍详细使用 1.String 操作 redis中的String在在内存中按照一个name对应一个value来存储 ...

  5. Redis五大数据类型String、Hash、List、Set、ZSet

    目录 String Hash List Set ZSet String String类型是Redis最基本的数据类型一个键最大能存储512MB set key value,set用于给key设定值,如 ...

  6. 缓存加速------Redis的五种数据类型(String,List,Hash,Set,Sorted Set)

    目录 一.String数据类型 1.set,get 2.append 3.incr,decr,incrby,decrby 4.strlen 5.setex 6.getset 7.setnx 8.mse ...

  7. Redis string和hash数据类型

    文章目录 一.redis 数据存储格式 二.string 1. string基本操作 2. string扩展操作 3. 数据库中热点数据key命名规范 4. string类型注意事项 三.hash 1 ...

  8. Jedis--操作String,hash,list,setshortedset

    黑马程序 Jedis–快速入门 @Testpublic void test1(){Jedis jedis = new Jedis("127.0.0.1",6379);jedis.s ...

  9. Redis的数据类型 - string、hash、list

    string 字符串类型可以是字符类型.数值类型.bitmaps 可以通过help @string 查看string相关命令 set set key value [expiration EX seco ...

最新文章

  1. ROS Melodic 的依赖关系记录
  2. Makefile常用信息查询页
  3. 开发常识 持续更新~~
  4. 吉林省第二条国际铁路联运大通道“长珲欧”启动测试
  5. quasar 异步回调_Java IO基准测试:Quasar与异步ForkJoinPool与ManagedBlock
  6. fastdfs的tracker启动之后一直选举_jraft选举策略
  7. python飞机大战实训报告200_飞机大战实训报告.doc
  8. redis db0 到 db15_深入剖析Redis系列: Redis集群模式搭建与原理详解
  9. 想为 iPhone X 做交互设计?你需要读这篇文章
  10. VHDL 实现一位全加器以及 Quartus II 初探
  11. 简记_关于刷三防漆的几点个人见解
  12. 高数 | 【一元函数微分学】导数部分经典快速例题
  13. 无人机航测技术在地形测绘中的应用
  14. DAY1(02-HTML标签(上))
  15. Hibernate——入门
  16. UE4中动画优化与压缩
  17. 数据结构个人笔记 第12课 数组
  18. Golang的viper库
  19. 青海湖鸟岛上神气的蛋
  20. BigBrother的大数据之旅 Day 1 Linux(1)

热门文章

  1. 网站导航栏如何设置更利于提升SEO优化效果?
  2. 如何优化网站结构才促使网站排名“节节高”?
  3. 企业网站优化两个重点多加重视!
  4. linux下进程的tty,Linux下TTY驱动程序分析
  5. tensorflow 线性回归 iris
  6. 字典转json时排序
  7. umi搭建react+antd项目(五)子组件编写
  8. 萌新的九宫棋(C语言)
  9. Ubuntu 16.04- Package has no installation candidate解决方式,Ubuntu正确安装openssl-server的方法...
  10. (转)七牛云phpSDK使用笔记