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将 ...
随机推荐
- 【AC自动机】【动态规划】poj3691 DNA repair
http://blog.csdn.net/kk303/article/details/6929641 http://blog.csdn.net/human_ck/article/details/657 ...
- 【kmp算法】模板
void GetFail(char P[],int __next[])//__next[i]表示s[0]~s[i-1]的前缀中,最大长度相等的前后缀是多少 { __next[0]=-1; int le ...
- 【莫队算法】【权值分块】bzoj3236 [Ahoi2013]作业
莫队显然.然后维护转移的时候如果用树状数组,则很容易TLE.所以用权值分块维护转移. 总复杂度O(m*sqrt(n)). #include<cstdio> #include<algo ...
- 【贪心】【二维偏序】【权值分块】bzoj1691 [Usaco2007 Dec]挑剔的美食家
既然题目中的要求满足二维偏序,那么我们很自然地想到将所有东西(草和牛)都读进来之后,对一维(美味度)排序,然后在另一维(价值)中取当前最小的. 于是,Splay.mutiset.权值分块什么的都支持查 ...
- 转载:win10 下安装Oracle 11g(问题:环境不满足最低要求)
安装oracle11g时遇到INS-13001环境不满足最低要求 在以管理员身份运行setup.exe之后,出现了:[INS-13001]环境不满足最低要求,通过网上搜索之后找到了解决途径 首先,打开 ...
- Instant Run 的操作影响到了代码,导致Android App启动闪退的问题
转自yuhc163原文android启动应用java.lang.NoClassDefFoundError: Class not found using the boot class loader; n ...
- t-sql 笔记(1)
Toad-for-SQL-Server-Freeware 1.查询哪些数据库对象使用了某个表 SELECT b.[name], a.[definition] FROM sys.all_sql_modu ...
- Android ViewStub的使用方法
大家写项目的时候肯定会有一些东西提前写好,可是不到一定条件是不想让它显示出来的.我们可能的做法就是让它View.GONE 或View.INVISIBLE等到一定条件了在代码里面这设置View.VISI ...
- 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:3.安装Oracle RAC-3.5.安装oracle11gr2 database 软件与创建数据库
3.5.安装oracle11gr2 database 软件与创建数据库 3.5.1.安装Oracle 11gr2 Database 以oracle 用户登录到节点一,切换到软件安装目录,执行安装. 在 ...
- php漏洞挖掘书籍
PHP是一种被广泛使用的脚本语言,尤其适合web开发.具有跨平台,容易学习,功能强大等特点,据统计全世界超过34%的网站有php的应用,包括Yahoo.sina.163.sohu等大型门户网站.而且很 ...