呕  卡64M内存卡了好久

题目描述

题目大意

给出一个字符串 S,每次询问一个区间的本质不同的子串个数。$|S| \le 2000$.


题目分析

首先无脑$n^2$个set开起来:MLE

稍微想想这个东西是能够区间dp的:对于一个字符串$[l,r]$,它的存在首先给所有包含$[l,r]$的$f[i][j]$贡献$1$;考虑相同的字符串下一次出现的位置$[l',r']$,那么对所有包含$[l,r']$的$f[i][j]$贡献$-1$。最后再按照顺序累加一下即可。

第一次:std::map存一个哈希值上一次出现的位置,MLE

第二次:手写哈希表,$\mod 8000007$挂链,MLE

第三次:手写哈希表,$\mod 5000007$挂链,MLE

第四次:手写哈希表,$\mod 10007$挂链,TLE?

第五次:手写哈希表,$\mod 500007$挂链、查询时候顺带后续修改,MLE???

嗯?这啥玩意?

啧。后来意识到枚举不同长度的时候,哈希表里历史记录值都是没用的。所以每次枚举长度都应该重置哈希表。而且这样一来,哈希表模数和空间就可以开小了。

还听说这个经典问题有一个$O(n)$做法?

网上找了一下只有两个类似的是:

1.loj#6070. 「2017 山东一轮集训 Day4」基因  强制在线询问$s[l\cdots r]$中有多少本质不同的回文子串 $n\le 10^5,q\le 2\times10^5$

2.「湖南省队集训2018 Day2」有趣的字符串题  每个询问会询问一段区间的本质不同回文子串个数 $n\le 3\times 10^5,m\le 10^6$

不过这两个题都要用到回文子串的性质:“一个串的所有回文后缀可以被划分成不超过log个等差数列”。所以网上尚没有找到这个问题的$O(n)$解法?

 #include<bits/stdc++.h>
typedef unsigned long long uint;
const int maxn = ;
const int maxp = ;
uint base = ; struct node
{
uint num;
int val;
node(uint a=, int b=):num(a),val(b) {}
}edges[maxp];
struct Hash_Table
{
#define MO 10007
int head[],nxt[maxp],edgeTot;
void init(){edgeTot=,memset(head, -, sizeof head);}
int query(uint x, int c)
{
for (int i=head[x%MO]; i!=-; i=nxt[i])
if (edges[i].num==x){
std::swap(c, edges[i].val);
return c;
}
edges[++edgeTot] = node(x, c), nxt[edgeTot] = head[x%MO], head[x%MO] = edgeTot;
return ;
}
#undef MO
}g;
int T,n,q,l,r;
char s[maxn];
int f[maxn][maxn];
uint pwr[maxn],hsh[maxn],val; uint hash(int l, int r)
{
return hsh[r]-hsh[l-]*pwr[r-l+];
}
int main()
{
// freopen("hdu4622.in","r",stdin);
// freopen("hdu4622.out","w",stdout);
pwr[] = ;
for (int i=; i<=; i++)
pwr[i] = pwr[i-]*base;
for (scanf("%d",&T); T; --T)
{
scanf("%s",s+);
n = strlen(s+);
for (int i=; i<=n; i++) hsh[i] = hsh[i-]*base+s[i]-'a'+;
for (int i=; i<=n; i++)
for (int j=i; j<=n; j++) f[i][j] = ;
for (int d=; d<=n; d++)
{
g.init();
for (int i=,pos; i+d-<=n; i++)
{
val = hash(i, i+d-), pos = g.query(val, i);
if (pos) --f[pos][i+d-];
++f[i][i+d-];
}
}
for (int i=n; i>=; i--)
for (int j=i; j<=n; j++)
f[i][j] += f[i+][j]+f[i][j-]-f[i+][j-];
for (scanf("%d",&q); q; --q)
scanf("%d%d",&l,&r), printf("%d\n",f[l][r]);
}
return ;
}

END

【经典dp】hdu4622Reincarnation的更多相关文章

  1. HDU 1003 Max Sum --- 经典DP

    HDU 1003    相关链接   HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...

  2. poj1458 求最长公共子序列 经典DP

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45763   Accepted: 18 ...

  3. NYOJ - 矩形嵌套(经典dp)

    矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...

  4. 51nod 1412 AVL树的种类(经典dp)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...

  5. NYOJ 16 矩形嵌套(经典DP)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms  |           内存限制:65535 KB 难度: ...

  6. poj 1050 To the Max 最大子矩阵和 经典dp

    To the Max   Description Given a two-dimensional array of positive and negative integers, a sub-rect ...

  7. CS Academy Distinct Neighbours(经典dp)

    CS Academy Distinct Neighbours(经典dp) 题意: 求相邻无相同数字的合法的排列数 题解: 题解 先将相同的数字分为一类,假设共有n组 定义\(dp[i][j]\)表示前 ...

  8. 【经典dp 技巧】8.13序列

    经典的拆绝对值 题目大意 给定$n$个具有顺序的序列,允许对每个序列循环移动.记第$i$个序列尾元素为$x$,$i+1$个序列首元素为$y$,定义其连接收益为$|x-y|*i$,求$n$个序列连接最大 ...

  9. POJ 1160:Post Office 邮局经典DP

    Post Office Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17168   Accepted: 9270 Desc ...

随机推荐

  1. 【Python】【demo实验6】【练习实例】【奖金发放计算(阶梯)】

    题目: 企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:20万到40万 ...

  2. 基于.NET架构的树形动态报表设计与应用

    在一些统计报表中,利用树形结构报表来实现维度钻取功能是十分常见的.通过逐级钻取,可以快速查看更细粒度的指标数据,如项目施工进度报告等. 使用葡萄城报表控件——ActiveReports ,即可轻松设计 ...

  3. WijmoJS V2019.0 Update2发布:再度增强 React 和 Vue 框架的组件功能

    前端开发工具包 WijmoJS 在2019年的第二个主要版本 V2019.0 Update2 已经发布,本次发布涵盖了React 和 Vue 框架下 WijmoJS 前端组件的功能增强,并加入更为易用 ...

  4. MySQL中的数据类型 [数值型、字符串型、时间日期型]

    MySQL中的数据类型 [数值型.字符串型.时间日期型] MySQL中各数据类型 1. 数值类型(整型) 类型 数据大小 类型 (无符号:unsigned) 数据大小 存储空间 tinyint -12 ...

  5. GoJS

    GoJS GoJS示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  6. nginx.conf and dockerfile带颜色

    wget http://www.vim.org/scripts/download_script.php?src_id=14376 -O nginx.vim mv nginx.vim /usr/shar ...

  7. GukiZ and Binary Operations CodeForces - 551D (组合计数)

    大意: 给定$n,k,l,m$, 求有多少个长度为$n$, 元素全部严格小于$2^l$, 且满足 的序列. 刚开始想着暴力枚举当前or和上一个数二进制中$1$的分布, 但这样状态数是$O(64^3)$ ...

  8. 怎样理解HTMLCollection接口

    和 NodeList 类似, HTMLCollection 也是一个 类数组对象, 和NodeList不同的是, 它是各种 元素节点 的集合, 且不具有 forEach() 方法, 因此如果不转为真正 ...

  9. charles 抓包 (二)

    本文基于charles 抓包 https (1)中的配置完成. 1.移动设备上的网络请求 打开要调试的APP,请求就会先发送到Charles,然后验证是否允许访问. 当点击允许后,可以在Proxy - ...

  10. 大数据学习(3)- redis集群

    安装方法摘自 http://www.redis.cn/topics/cluster-tutorial.html 这个方法为简单版的方法,在原文的基础上,我加了一点参数,其他参数配置可以请教其他大神 搭 ...