hdu 4821 字符串hash+map判重 String (长春市赛区I题)
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题)的更多相关文章
- (通俗易懂小白入门)字符串Hash+map判重——暴力且优雅
字符串Hash 今天我们要讲解的是用于处理字符串匹配查重的一个算法,当我们处理一些问题如给出10000个字符串输出其中不同的个数,或者给一个长度100000的字符串,找出其中相同的字符串有多少个(这样 ...
- HDU 4821 字符串hash
题目大意: 希望找到连续的长为m*l的子串,使得m个l长的子串每一个都不一样,问能找到多少个这样的子串 简单的字符串hash,提前预处理出每一个长度为l的字符串的hash值 #include < ...
- hdu 5012 bfs --- 慎用STL 比方MAP判重
http://acm.hdu.edu.cn/showproblem.php?pid=5012 发现一个问题 假设Sting s = '1'+'2'+'3'; s!="123"!!! ...
- POJ3087 Shuffle'm Up —— 打表找规律 / map判重
题目链接:http://poj.org/problem?id=3087 Shuffle'm Up Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- 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 ...
- hdu 4622 (hash+“map”)
题目链接:https://vjudge.net/problem/HDU-4622 题意:给定t组字符串每组m条询问--求问每条询问区间内有多少不同的子串. 题解:把每个询问区间的字符串hash一下存图 ...
- BFS以及hash表判重的应用~
主要还是讲下hash判重的问题吧 这道题目用的是除法求余散列方式 前几天看了下算法导论 由于我们用的是线性再寻址的方式来解决冲突问题 所以hash表的大小(余数的范围)要包含我们要求的范围 对mod的 ...
- hdu 2610 2611 dfs的判重技巧
对于全排列枚举的数列的判重技巧 1:如果查找的是第一个元素 那么 从0开始到当前的位置看有没有出现过这个元素 出现过就pass 2: 如果查找的不是第一个元素 那么 从查找的子序列当前位置的前一个元素 ...
- Hdu 4821 (字符串hash+map)
题目链接https://vjudge.net/problem/HDU-4821 题意:给定字符串S ,询问用几个子串满足 : 1.长度为n*len . 2. n个子串都不相同. 题解:倒序hash将 ...
随机推荐
- [BZOJ1143][CTSC2008]祭祀river(Dilworth定理+二分图匹配)
题意:给你一张n个点的DAG,最大化选择的点数,是点之间两两不可达. 要从Dilworth定理说起. Dilworth定理是定义在偏序集上的,也可以从图论的角度解释.偏序集中两个元素能比较大小,则在图 ...
- 【spfa】bzoj3921 Mimori与树海
考虑“删除后图仍连通”,即其不是无向图的桥(bridge),可以用Tarjan算法预处理,这里不赘述. [算法一] 枚举删除的是哪条边,然后枚举起点,暴搜,统计答案. 可以通过0.1号测试点. 预计得 ...
- ujmp使用心得
1)对矩阵转置运算时: Matrix test2 = oneMatrix.transpose(); Matrix test2 = oneMatrix.transpose(Ret.LINK); Matr ...
- SVN安装中遇到的问题
新的版本:1.9.5 必须使用Apache Portable Runtime Utility 1.5.4 Released没有安装的话需要先安装 需要安装apr.apr-util sqlite zli ...
- vscode 使用笔记
https://code.visualstudio.com/docs/setup/setup-overview#_proxy-server-support 如果使用代理上网时,需要配置: 在 se ...
- 使用spice连接kvm guest主机
spice技术已经出来很久了,其是优于VNC的一种远程桌面协议,之所以这里记录下,是由于某些加密视频文件(如以vpy结尾的超时代视频加密),会识别主机的特征吗,一旦主机重启后这些视频又没法查看了,所以 ...
- Django入门与实践
安装: 1.https://www.djangoproject.com/查找最新版本 2.pip install Django==1.10.6安装Django 创建项目: 1.打开命令行,进入想要 ...
- Git与GitLab
Git与GitLab 一.Git Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个 ...
- [Javascript] Conditionally spread entries to a JavaScript object
In JavaScript, we often end up composing one object out of several other objects. Luckily there's a ...
- 使用Eclipse载入一个现有的java项目
下文的导入记录了在Eclipse环境中,要对已经下载好的java源码进行载入时的步骤.主要用于下载后的文件不方便进行拷贝到其它位置的情况.笔者几次用到这个顺序来载入项目,但是都是隔非常长时间才用一次, ...