题目链接: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 模板题的更多相关文章

  1. hdu-4080 Stammering Aliens 字符串hash 模板题

    http://acm.hdu.edu.cn/showproblem.php?pid=4080 求出现次数大于等于n的最长串. #include<iostream> #include< ...

  2. HDU 4622 Reincarnation Hash解法详解

    今天想学字符串hash是怎么弄的.就看到了这题模板题 http://acm.hdu.edu.cn/showproblem.php?pid=4622 刚开始当然不懂啦,然后就上网搜解法.很多都是什么后缀 ...

  3. hdu 4622 Reincarnation(后缀数组)

    hdu 4622 Reincarnation 题意:还是比较容易理解,给出一个字符串,最长2000,q个询问,每次询问[l,r]区间内有多少个不同的字串. (为了与论文解释统一,这里解题思路里sa数组 ...

  4. HDU 1880 字符串hash 入门题

    Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔 ...

  5. HDU 4622 Reincarnation 后缀自动机 // BKDRHash(最优hash)

    Reincarnation Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) P ...

  6. HDU 2222(AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...

  7. HDU 5521.Meeting 最短路模板题

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  8. HDU 1711 - Number Sequence - [KMP模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  9. HDU 4622 Reincarnation 后缀自动机

    模板来源:http://blog.csdn.net/zkfzkfzkfzkfzkfzkfzk/article/details/9669747 解法参考:http://blog.csdn.net/dyx ...

随机推荐

  1. HTTP协议理解

    HTTP(Hyper Text Transfer Protocol)超文本传输协议,是一种请求响应式协议,类似两国会晤中需要遵守的规则.那么,其中有什么内容特点呢? HTTP特点: 1)支持客户端/服 ...

  2. Http Statis 500 -错误笔记

    HTTP Status 500 - type Exception report message description The server encountered an internal error ...

  3. 【Android Studio 小技巧】一键查看文件方法结构目录File Structure

    看源代码的时候,如果可以查看class中的所有方法,可以提高效率.Android Studio 中可以使用快捷键一键显示所有方法的目录. Mac: command + fn + F12 (在mac中的 ...

  4. 属性声明(property declarations), 自定义属性,自动生成 get 和 set 方法,getter 和 setter

    属性声明(property declarations), 自定义属性,自动生成 get 和 set 方法,getter 和 setter 一.普通的get 和set 属性. 一般的get 和set 属 ...

  5. webservice发布接口

    一:编写接口程序,计算功能类,有加减乘除四个方法 /** * */ package com.hlcui.util; /** * @author Administrator 将此类发布为公共接口 */ ...

  6. win8.1恢复win7 CTRL+Space切换输入法

    win8用起来还是有很多好用的东西的,但是最让我受不了的就是输入法的切换,可以说是丧心病狂!!!折磨了我好久,今天终于找到了解决的办法! 那就是这位博客园的哥们给出的方案! http://www.cn ...

  7. hdu 3440 差分约束

    看完题目第一遍,感觉很简单.当写完程序跑测试用例的时候,发现第二个总是过不了,然后好好研究了一下测试用例,才知道原来不是程序有问题,而是我的建图方式错了.对于这些无序的点,如果高的在右边,不等式是di ...

  8. Java反转单链表(code)

    主要是面试中可能会经常碰上该类似操作,尤其是稍大点公司,面试官可能并不在乎你能不能搞定该题,但是这类型题目最是能体现程序员的思维状态 ---一个迷糊头脑的程序员 怎能立志改变这个世界 /** * @a ...

  9. HTML+CSS 实现水流流动效果

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  10. 单击改变input的边框颜色

    input边框变色   今天布局页面的时候发现设计稿多了一项要求,就是点击input框的时候要求框框变色,以前没有遇到过,平时很多时候都用的:hover这次想着一样吧,看了之后发现不是想要的效果,ho ...