hdu 4622 Reincarnation 字符串hash 模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622
题意:给定一个长度不超过2000的字符串,之后有不超过1e5次的区间查询,输出每次查询区间中不同的子串个数?
做法1:字符串hash
一般的做法就是模拟每段子串的长度L(从1到 len),这样时间复杂度为O(n^2);但是里面并没有计算子串比较是否相等以及存储的时间,而这段时间就是将字符串看成是“数字”,这样存储和比较的时间均降为O(1)了;
下面讲讲模板;
1.如何将字符串看成一个“高精度的数字”,由于相同的子串不只是含有的字符个数的和字符类别要相同,同时还需要和数字一样分成在“什么位”上(如十位还是百位);下面的p[]就是这样一个表示在哪一位;同时s[i]表示的就是子串str[0...i-1],只不过表示成了数字的形式;这样之后就可以直接枚举长度L,并且将是否有重复的给“标记”下来;
注意:ans[pos][i+L-1] :表示的是只有子串起点在pos(其实之后的二维DP求和可以扩大到更大的区间),终点在i+L-1才需要-1;不是pos+L-1
2.将上面的标记累加起来,递推出二维的ans[][];即区间长度从小到大递推即可;
时间空间复杂度均为O(n^2)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define HASH 10007
#define MAXN 2007
struct StringMap{
int head[HASH],Next[MAXN],tot;
unsigned long long state[MAXN];
int f[MAXN];
void init(){
tot = ;
memset(head,-,sizeof(head));
}
int ins(unsigned long long val,int id)
{
int h = val%HASH;
for(int i = head[h];i != -;i = Next[i]){
if(val == state[i]){
int tmp = f[i];
f[i] = id;
return tmp;
}
}
f[tot] = id;
state[tot] = val;
Next[tot] = head[h];
head[h] = tot++;
return ;
}
}H;
char str[MAXN];
const int SEED = ;
unsigned long long p[MAXN];
unsigned long long s[MAXN];
int ans[MAXN][MAXN];
int main()
{
//freopen("in.txt","r",stdin);
p[] = ;
for(int i = ;i < MAXN;i++)
p[i] = p[i-]*SEED;
int T;
scanf("%d",&T);
while(T--){
scanf("%s",str);
int len = strlen(str);
s[] = ;
for(int i = ;i <= len;i++)
s[i] = s[i-]*SEED+str[i-];
memset(ans,,sizeof(ans));
for(int L = ;L <= len;L++){
H.init();
for(int i = ;i+L- <= len;i++){
int pos = H.ins(s[i+L-]-s[i-]*p[L],i);
ans[i][i+L-]++;
ans[pos][i+L-]--; //做标记
}
}
for(int i = len;i >= ;i--)
for(int j = i;j <= len;j++)
ans[i][j] += ans[i+][j] + ans[i][j-] - ans[i+][j-]; //递推出所有结果
int Q,l,r;
scanf("%d",&Q);
while(Q--){
scanf("%d%d",&l,&r);
printf("%d\n",ans[l][r]);
}
}
}
hdu 4622 Reincarnation 字符串hash 模板题的更多相关文章
- hdu-4080 Stammering Aliens 字符串hash 模板题
http://acm.hdu.edu.cn/showproblem.php?pid=4080 求出现次数大于等于n的最长串. #include<iostream> #include< ...
- HDU 4622 Reincarnation Hash解法详解
今天想学字符串hash是怎么弄的.就看到了这题模板题 http://acm.hdu.edu.cn/showproblem.php?pid=4622 刚开始当然不懂啦,然后就上网搜解法.很多都是什么后缀 ...
- hdu 4622 Reincarnation(后缀数组)
hdu 4622 Reincarnation 题意:还是比较容易理解,给出一个字符串,最长2000,q个询问,每次询问[l,r]区间内有多少个不同的字串. (为了与论文解释统一,这里解题思路里sa数组 ...
- HDU 1880 字符串hash 入门题
Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔 ...
- HDU 4622 Reincarnation 后缀自动机 // BKDRHash(最优hash)
Reincarnation Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) P ...
- HDU 2222(AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...
- HDU 5521.Meeting 最短路模板题
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- HDU 1711 - Number Sequence - [KMP模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- HDU 4622 Reincarnation 后缀自动机
模板来源:http://blog.csdn.net/zkfzkfzkfzkfzkfzkfzk/article/details/9669747 解法参考:http://blog.csdn.net/dyx ...
随机推荐
- [转]Oracle EBS APIs
FROM:http://blog.csdn.net/pan_tian/article/details/7754598 API To Find Sales Order's Subtotal,discou ...
- div容器内文本对齐--神奇的css
有时候使用一些css往往能达到意想不到的效果 最近需要在页面上显示读取的文本内容,中英文混杂着,我把它们统统抛到div中div设置了宽度,效果是相当糟糕,左对齐,右端长短不一,有的超出长度,有的不够长 ...
- scope重定义
.directive('myAttr', function() { return { restrict: 'E', scope: { customerInfo: '=info' }, template ...
- C语言下的简易计算器
#include <stdio.h> #include <math.h> int main() { double data1, data2; char op; == scanf ...
- overflow:hidden清除浮动原理解析及清除浮动常用方法总结
最近在看<CSS Mastery>这本书,里面有用overflow:hidden来清理浮动的方法.但是一直想不明白为什么能够实现清除浮动,查阅了网络上的解释,下面来总结一下. 一.首先来想 ...
- HTTP - 条件请求
当 HTTP 请求包含 If-XXX 这种样式的首部时,服务器会对附带的条件进行判断,只有判断指定条件为真,才会执行请求.这样的请求首部有五个,分别是 If-Modified-Since.If-Unm ...
- Git CMD - checkout: Switch branches or restore working tree files
命令格式 git checkout [-q] [-f] [-m] [<branch>] git checkout [-q] [-f] [-m] --detach [<branch&g ...
- 百练 2973 Skew数 解题报告
思路: 计算出每一个skew数的不同位数表示的权值,然后用该位与权值相乘.用int数组来装权值,用char数组来装skew数. 代码: #include<stdio.h> #include ...
- Sqlserver 关于游标
对于sql来说查询的思维方式的面向集合对于游标来说:思维方式是面向行的 性能上:游标会吃更多内存,减少可见的并发,锁定资源等 当穷尽了while循环,临时表,表变量,自建函数,或其他方式仍然无法实现某 ...
- 第四十三篇、利用NSProxy解决NSTimer内存泄漏问题
问题描述: 用NSTimer来实现每隔一定时间执行制定的任务,例如最常见的广告轮播图.如果我们在 timerWithTimeInterval:1 target:self 中指定target为当前控制器 ...