题意:

一个字符串S  问其中有几个子串能满足以下条件:

1、长度为M*L

2、可以被分成M个L长的小串  每个串都不一样

分析:

hash方法,一个种子base,打表出nbase[i]表示base的i次方

将以i位字符开头之后的串hash成一个无符号长整型:hash[i]=hash[i+1]*base+str[i]-'a'+1

然后每个L长度的小串的hash值即为:hash[i]-hash[i+L]*nbase[L]

map记录hash值的个数

以i位字符开头的字符串与以i+L位字符开头的字符串只相差两个地方,减去hash[i ~ i+L],加上hash[i+M*L ~ i+(M+1)*L]

这样算节省了很多时间

#include <bits/stdc++.h>
using namespace std; typedef unsigned long long ull;
const int maxn=100005;
char str[maxn];
ull shash[maxn],nbase[maxn],base=31;
map<ull,int>mp; int main()
{
// freopen("in.txt","r",stdin);
int M,L;
nbase[0]=1;
for(int i=1;i<maxn;i++)
nbase[i]=nbase[i-1]*base;
while(~scanf("%d%d",&M,&L))
{
scanf("%s",str);
int n=strlen(str);
shash[n]=0;
for(int i=n-1;i>=0;i--)
shash[i]=shash[i+1]*base+str[i]-'a'+1;
int ans=0;
for(int i=0;i<L && i+M*L<=n;i++)
{
mp.clear();
for(int j=i;j<i+M*L;j+=L)
mp[shash[j]-shash[j+L]*nbase[L]]++;
if(mp.size()==M) ans++;
for(int j=i+L;j+M*L<=n;j+=L)
{
ull tmp=shash[j-L]-shash[j]*nbase[L];
mp[tmp]--;
if(mp[tmp]==0) mp.erase(tmp);
mp[shash[j+(M-1)*L]-shash[j+M*L]*nbase[L]]++;
if(mp.size()==M) ans++;
}
}
printf("%d\n",ans);
}
return 0;
}

HDU 4821 2013长春现场赛hash的更多相关文章

  1. HDU 4816 Bathysphere (2013长春现场赛D题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 2013长春区域赛的D题. 很简单的几何题,就是给了一条折线. 然后一个矩形窗去截取一部分,求最 ...

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

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

  3. HDU 4818 Golden Radio Base (2013长春现场赛B题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 进制转换. 现场根据题目给的两个公式,不断更新!!! 胡搞就可以了. 现场3A,我艹,一次循环开 ...

  4. HDU 4815 Little Tiger vs. Deep Monkey(2013长春现场赛C题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4815 简单的DP题. #include <stdio.h> #include <st ...

  5. HDU 4815 Little Tiger vs. Deep Monkey 2013 长春现场赛C题

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4815 [题意] n个题目,每题有各自的分数,A有50%的概率答对一道题目得到相应分数,B想要在至少P的概率 ...

  6. hdu 4813(2013长春现场赛A题)

    把一个字符串分成N个字符串 每个字符串长度为m Sample Input12 5 // n mklmbbileay Sample Outputklmbbileay # include <iost ...

  7. hdu 4764 && 2013长春网赛题解

    一个组合游戏题. 解答: 从后面往前面推,首先n-1是必胜位,然后前面的k位是必败位,如此循环下去.所以题目就容易了! 代码: #include<cstdio> using namespa ...

  8. hdu 4788 (2013成都现场赛 H题)

    100MB=10^5KB=10^8B 100MB=100*2^10KB=100*2^20B Sample Input2100[MB]1[B] Sample OutputCase #1: 4.63%Ca ...

  9. HDU 4763 Theme Section (2013长春网络赛1005,KMP)

    Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

随机推荐

  1. VIM 三种模式和常用命令

    引言 大数据开发工作中,周围的同事不是用 VIM 就是 Emacs,你要是用 UltraEdit 或 notepad++ 都不好意思跟人家打招呼...什么插件呀.语法高亮呀.拼写检查呀,能给它开的都给 ...

  2. Arduino+AS608指纹锁避坑记

    Arduino+AS608指纹锁避坑记 .title { text-align: center; margin-bottom: 0.2em } .subtitle { text-align: cent ...

  3. selenium常用代码

    from selenium import webdriver # 1. 添加浏览器设置参数对象 options = webdriver.ChromeOptions() # 2. 设置中文,与下载无弹窗 ...

  4. Linux 安装配置 tftp 服务器

    1.安装TFTP服务 安装服务端 sudo apt-get install tftpd-hpa 安装客服端 sudo apt-get install tftp-hpa 2.创建TFTP服务器目录 cd ...

  5. Python+Selenium - 窗口切换

    当有新窗口出现时,并要在新窗口操作,步骤: 1.产生新窗口 2.获取所有窗口的句柄:driver.window_handles 3.切换函数:driver.switch_to.window(新窗口句柄 ...

  6. 可视化反投射:坍塌尺寸的概率恢复:ICCV9论文解读

    可视化反投射:坍塌尺寸的概率恢复:ICCV9论文解读 Visual Deprojection: Probabilistic Recovery of Collapsed Dimensions 论文链接: ...

  7. 多加速器驱动AGX的目标检测与车道分割

    多加速器驱动AGX的目标检测与车道分割 Object Detection and Lane Segmentation Using Multiple Accelerators with DRIVE AG ...

  8. Single Shot Multibox Detection (SSD)实战(下)

    Single Shot Multibox Detection (SSD)实战(下) 2. Training 将逐步解释如何训练SSD模型进行目标检测. 2.1. Data Reading and In ...

  9. jmeter设置成中文显示

    meter默认语言设置: 1.临时设置: 进入options -- Choose Language -- 选择中文简体,设置后语言切换成中文,重启失效 2.永久设置:进入jmeter目录下的bin目录 ...

  10. springcloud中 getway中的断言配置: Predicate 9中配置过程, getway的 filters实现限流功能:

    https://www.cnblogs.com/grasp/p/11506426.html 这里引用别人的,,且试验过 ,没问题 server: port: 9527 spring: applicat ...