[kmp+dp] hdu 4628 Pieces
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4622
Reincarnation
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 2096 Accepted Submission(s): 715
Given you a string s consist of lower-case English letters only,denote f(s) as the number of distinct sub-string of s.
And you have some query,each time you should calculate f(s[l...r]), s[l...r] means the sub-string of s start from l end at r.
For each test cases,the first line contains a string s(1 <= length of s <= 2000).
Denote the length of s by n.
The second line contains an integer Q(1 <= Q <= 10000),denote the number of queries.
Then Q lines follows,each lines contains two integer l, r(1 <= l <= r <= n), denote a query.
2
bbaba
5
3 4
2 2
2 5
2 4
1 4
baaba
5
3 3
3 4
1 4
3 5
5 5
3
1
7
5
8
1
3
8
5
1HintI won't do anything against hash because I am nice.Of course this problem has a solution that don't rely on hash.
题目意思:
给一个字符串,对每一个字符串,有非常多询问,询问给定区间不同子串的个数。
解题思路:
kmp+dp
普通的dp转移肯定超时。
sa[i][j]:表示以第j个字符開始可以往前最多的字符个数(如果为s个),要求满足【j-s+1,j】在【i,j-1】字符串区间出现。
这样要统计j開始的往前的情况,能够把字符串倒过来,把j作为第一个,然后1作为最后一个,求一遍next.然后更新sa[i][j] (i<j)
求出sa[i][j]后,就能够直接转移dp[i][j]=dp[i][j-1]+i-j+1-sa[i][j] //把第j个字符加上后,对整个子串个数的影响。减去在前面已经出现的。
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std; #define Maxn 2200 char sa1[Maxn];
char sa2[Maxn];
int next[Maxn];
int n,nn;
int sa[Maxn][Maxn],dp[Maxn][Maxn]; void getnext()
{
int j=0;
next[1]=0; for(int i=2;i<=nn;i++)
{
while(j>0&&sa1[j+1]-sa1[i])
j=next[j];
if(sa1[j+1]==sa1[i])
j++;
next[i]=j;
}
return ;
}
int main()
{
int t; scanf("%d",&t);
while(t--)
{
scanf("%s",sa1+1);
n=strlen(sa1+1);
for(int i=1;i<=n;i++)
sa2[i]=sa1[n+1-i]; for(int i=1;i<=n;i++)
{ for(int j=i;j<=n;j++)
sa1[j-i+1]=sa2[j];
nn=n-i+1;
getnext();
sa[n+1-i-1][n+1-i]=next[2]; for(int j=i+2;j<=n;j++)
sa[n+1-i-(j-i)][n+1-i]=max(next[j-i+1],sa[n+1-i-(j-i)+1][n+1-i]);
} for(int i=1;i<=n;i++)
{
dp[i][i]=1;
for(int j=i+1;j<=n;j++)
dp[i][j]=dp[i][j-1]+(j-i+1)-sa[i][j]; }
int q; scanf("%d",&q);
while(q--)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",dp[a][b]);
}
}
return 0;
}
[kmp+dp] hdu 4628 Pieces的更多相关文章
- HDU 4628 Pieces(DP + 状态压缩)
Pieces 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4628 题目大意:给定一个字符串s,如果子序列中有回文,可以一步删除掉它,求把整个序列删除 ...
- hdu 4628 Pieces 状态压缩dp
Pieces Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total S ...
- hdu 4628 Pieces 状压dp
题目链接 枚举所有状态, 1表示这个字符还在原来的串中, 0表示已经取出来了. 代码中j = (j+1)|i的用处是枚举所有包含i状态的状态. #include <iostream> #i ...
- HDU 4628 Pieces(状压DP)题解
题意:n个字母,每次可以删掉一组非连续回文,问你最少删几次 思路:把所有回文找出来,然后状压DP 代码: #include<set> #include<map> #includ ...
- hdu 4628 Pieces
http://acm.hdu.edu.cn/showproblem.php?pid=4628 状态压缩DP 时间复杂度应该是 16*(2^32) 但是运行时要远小于这个数 所以加一定剪枝就可以过 代码 ...
- HDU 4628 Pieces(状态压缩+记忆化搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=4628 题意:给个字符窜,每步都可以删除一个字符窜,问最少用多少步可以删除一个字符窜分析:状态压缩+记忆化搜索 ...
- hdu 4628 Pieces(状态压缩+记忆化搜索)
Pieces Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total S ...
- HDU 6153 A Secret ( KMP&&DP || 拓展KMP )
题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...
- [HDOJ5763]Another Meaning(KMP, DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5763 题意:给定两个字符串a和b,其中a中的字符串如果含有子串b,那么那部分可以被替换成*.问有多少种 ...
随机推荐
- HDOJ 4424 Conquer a New Region
并检查集合 侧降序,每增加一个侧面应该推断,其中基本建设方..... Conquer a New Region Time Limit: 8000/4000 MS (Java/Others) Me ...
- 推断序列的端部的大小C规划
概念 big-endian格式:高字节字符数据被存储在低地址.字数据的低字节存放在高地址. 小尾数格式:相较于大端存储格式,在小尾数格式.低地址存储在字数据的低字节.的是字数据的高字节. 如5A6C中 ...
- NuttX 介绍
(嵌入式 实时操作系统 rtos nuttx 7.1) NuttX 介绍 转载请注明出处:http://blog.csdn.net/zhumaill/article/details/24197637 ...
- StackExchange.Redis 使用-同步 异步 即发即弃 (三)
访问单个服务器 有时候需要为单个服务器指定特定的命令 . IServer server = redis.GetServer("localhost", 6379); GetServe ...
- SWFUpload多文件上传 文件数限制 setStats()
使用swfupload仿公平图片上传 SWFUpload它是基于flash与javascript的client文件上传组件. handlers.js文件 完毕文件入列队(fileQueued) → 完 ...
- 无法使用SQL login去登陆SQL Server - 'Password did not match'
原文:无法使用SQL login去登陆SQL Server - 'Password did not match' 出自:http://blogs.msdn.com/b/apgcdsd/archive/ ...
- hibernate 双向n-n
领域模型: 关系数据模型 双向 n-n 关联须要两端都使用集合属性 双向n-n关联必须使用连接表 集合属性应添加 key 子元素用以映射外键列, 集合元素里还应添加many-to-many子元素关联实 ...
- dirname
dirname 命令来删除文件路径中最后一个/以及一些背后.当文件通常能够得到一个文件夹. 实例: dean@dean-Latitude-3330:~$ dirname /usr/bin/ /usr ...
- socket抓取网页
#include <iostream> #include <string> #include <netdb.h> #include <stdio.h> ...
- paip.自适应网页设计 同 响应 与设计的原理的差and实践总结
paip.自适应网页设计 同 响应 与设计的原理的差and实践总结 响应式Web设计(Responsive Web design)的理念是: 1 #-----------自适应布局VS响应式布局 2 ...