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

昨晚卡了非常久,開始TLE,然后优化了之后,由于几个地方变量写混。一直狂WA。搞得我昨晚都失眠了,,。

这几次hash军写错的变量--tmp=(j==m-1)?ah[j]:(ah[j]-ah[j-m]*base[m]);  外层循环变量是i,我写的字符串hash的几题都写成tmp=(i==0)?

ah[j]:(ah[j]-ah[j-m]*base[m]); 二逼啊

题目大意:

给定一个字符串(最长10^5)。

从中选一个长度为 m * l 的子串。要求该子串能拆分为m个长度为 l 的一一不同的串(串仅仅要有一个字母不同即觉得是不同)。

问有多少种取法。


优化的方法--从字符串第一个位置開始,每L个的hash都算出来,当到了第一个第m个L位置的时候。继续往后算--去掉第一个L的hash值,加上第m*l+m的hash值

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std; #define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdin) const ull B = 1e8+7;
const int MAXN = 100010; ull ah[MAXN],base[MAXN];
char a[MAXN];
int n;//length of a int main()
{
//IN("hdu4821.txt");
int m,ll;
int ans=0,cnt,last,sc;
base[0]=1;
ull tmp;
rep(i,1,MAXN)
base[i]=base[i-1]*B;
while(~scanf("%d%d",&ll,&m))
{
scanf("%s",a);
n=strlen(a);
ah[0]=a[0];ans=0;
for(int i=1;i<=n;i++)
ah[i]=ah[i-1]*B+a[i]; //ah[i] 以i结尾的字符串的hash值
for(int i=0;i<m && i+ll*m<=n;i++)
{
map<ull,int>mp;
for(int j=i+m-1;j<i+ll*m;j+=m)
{
tmp=(j==m-1)? ah[j]:(ah[j]-ah[j-m]*base[m]);
mp[tmp]++;
}
if(mp.size()==ll)ans++;
int pos=i+m-1;
tmp=(i==0)? ah[m-1]:(ah[pos]-ah[pos-m]*base[m]);
mp[tmp]--;
if(mp[tmp] == 0)mp.erase(tmp);
for(int j=i+ll*m+m-1;j<n;j+=m)
{
tmp=ah[j]-ah[j-m]*base[m];
mp[tmp]++;
if(mp.size()==ll)ans++;
pos+=m;
tmp=ah[pos]-ah[pos-m]*base[m];
mp[tmp]--;
if(mp[tmp] == 0)mp.erase(tmp);
}
mp.clear();
}
printf("%d\n",ans);
}
return 0;
}

hdu 4821 字符串hash+map判重 String (长春市赛区I题)的更多相关文章

  1. (通俗易懂小白入门)字符串Hash+map判重——暴力且优雅

    字符串Hash 今天我们要讲解的是用于处理字符串匹配查重的一个算法,当我们处理一些问题如给出10000个字符串输出其中不同的个数,或者给一个长度100000的字符串,找出其中相同的字符串有多少个(这样 ...

  2. HDU 4821 字符串hash

    题目大意: 希望找到连续的长为m*l的子串,使得m个l长的子串每一个都不一样,问能找到多少个这样的子串 简单的字符串hash,提前预处理出每一个长度为l的字符串的hash值 #include < ...

  3. hdu 5012 bfs --- 慎用STL 比方MAP判重

    http://acm.hdu.edu.cn/showproblem.php?pid=5012 发现一个问题 假设Sting s = '1'+'2'+'3'; s!="123"!!! ...

  4. POJ3087 Shuffle'm Up —— 打表找规律 / map判重

    题目链接:http://poj.org/problem?id=3087 Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  5. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  6. hdu 4622 (hash+“map”)

    题目链接:https://vjudge.net/problem/HDU-4622 题意:给定t组字符串每组m条询问--求问每条询问区间内有多少不同的子串. 题解:把每个询问区间的字符串hash一下存图 ...

  7. BFS以及hash表判重的应用~

    主要还是讲下hash判重的问题吧 这道题目用的是除法求余散列方式 前几天看了下算法导论 由于我们用的是线性再寻址的方式来解决冲突问题 所以hash表的大小(余数的范围)要包含我们要求的范围 对mod的 ...

  8. hdu 2610 2611 dfs的判重技巧

    对于全排列枚举的数列的判重技巧 1:如果查找的是第一个元素 那么 从0开始到当前的位置看有没有出现过这个元素 出现过就pass 2: 如果查找的不是第一个元素 那么 从查找的子序列当前位置的前一个元素 ...

  9. Hdu 4821 (字符串hash+map)

    题目链接https://vjudge.net/problem/HDU-4821 题意:给定字符串S ,询问用几个子串满足 : 1.长度为n*len  . 2. n个子串都不相同. 题解:倒序hash将 ...

随机推荐

  1. Java里的浅复制与深复制

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...

  2. POJ 3608 Bridge Across Islands (旋转卡壳)

    [题目链接] http://poj.org/problem?id=3608 [题目大意] 求出两个凸包之间的最短距离 [题解] 我们先找到一个凸包的上顶点和一个凸包的下定点,以这两个点为起点向下一个点 ...

  3. 通过python的logging模块输出日志文件

    import logging import sys #获取logger实例 logger = logging.getLogger("baseSpider") # 括号后面填运行的文 ...

  4. no such file or directory : 'users/shikx/xxx/xxx/Appirater.m'

    删除此处红色的.m文件即可

  5. 大规模请求下,Linux 服务器连接数优化设置

    作者:heiyeluren 一般一个大规模Linux服务器请求数可能是几十万上百万的情况,需要足够的连接数来使用,所以务必进行相应的设置. 默认的Linux服务器文件描述符等打开最大是1024,用 u ...

  6. winform TreeView树节点上下移动

    /// <summary> /// 上移 /// </summary> /// <param name="sender"></param& ...

  7. 上手 Webpack ? 这篇就够了!

    JavaSript 模块化打包已混迹江湖许久.2009年,RequireJS 就提交了它的第一个版本,Browserify 接踵而至,随后其他打包工具也开始大行其道.最终,Webpack 从其中脱颖而 ...

  8. 使用CSS实现自定义input[checkbox]样式

    思路:使用label上的for熟悉,与checkbox上的id相对应来达到点击选中效果,在使用伪元素,或者其他元素,定位至checkbox上方,替代checkbox,并且隐藏checkbox,使用CS ...

  9. 用Qemu模拟vexpress-a9 (二) --- 搭建u-boot调试环境

    参考: http://blog.csdn.net/caspiansea/article/details/12986565 环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 ...

  10. debian 6软件更新源列表

    deb http://ftp.debian.org/debian/ squeeze main non-free contribdeb http://ftp.debian.org/debian/ squ ...