后缀数组poj2774 poj3415
来源:互联网 发布:glibc 源码 编辑:程序博客网 时间:2024/04/28 10:05
给出两个字符串T和P,请你用后缀数组完成下列任务:
任务1、计算这两个字符串的最长公共子串,并输出字典序最小的公共串。
任务2、计算长度不小于K的公共子串的个数(子串相同但位置不同算不同的子串)。
例如:T="xx",P="xx",K=1,则长度不小于K 的公共子串的个数是5。
再如:T="aababaa",P="abaabaa",K=2,则长度不小于K 的公共子串的个数是22。 【输入】
含3行,第一行是字符串T,第二行是字符串P,第3行一个整数K。 【输出】
含3行:
第1行一个整数,表示T和P的最长公共子串长度。
第2行一个字符串,表示T和P字典序最小的公共子串。
第3行一个字符串,表示T和P长度不小于K的公共子串数目。
分别对应任务1和任务2的答案。 【样例输入】
aababaa
abaabaa
2 【样例输出】
4
aaba
22 【数据范围】
字符串长度不超过100 000,1<=K<=100 000
【样例解释】
任务1、"aababaa"和"abaabaa",的最长公共子串为"aaba"或"abaa";
任务2、"aababaa"和"abaabaa",长度不小于2的不同公共子串有:
1、"aa" 共有4个;
2、"ab" 共有4个;
3、"ba" 共有4个;
4、"aab" 共有1个;
5、"aba" 共有4个;
6、"baa" 共有2个;
7、"aaba" 共有1个;
8、"abaa" 共有2个;
总共4+4+4+1+4+2+1+2=22个。
poj2774 poj3415
【问题分析】
task1:
可以等价于求两串所有后缀的最长公共前缀。
加一个奇葩的分隔符将两串连接起来,并标记新串s中的每个字符s[i](s[i]属于T则将i标记为1,s[i]属于P则将i标记为2,s[i]为分隔符则标记为0),求后缀数组,求height数组。
显然,如果求一个串的最长重复子串(可重叠),则ans=max(height[i]),但本题要求不是同一个字符串的两个后缀,所以更新答案前先判断一下sa[i]与sa[i-1]是否分属T,P即可。
task2:
对于P,T的两个后缀i,j,若LCP(i,j)=l,则对答案的贡献为l-k+1。
按task1连接成新串后,按height分组,每组内相邻后缀的height>=K,显然不同组之间是相互独立的,对于每一组,要求出所有P之前的T与之LCP-K+1的和,以及所有T之前的P与之的LCP-K+1的和,累加到ans中,显然暴力枚举的时间复杂度为O(N^2)。
经分析,这又是两个等价问题。现在只考虑求出所有P在同一组内之前的所有T与之LCP-K+1的和。
对于任意一个P来说,在它前面的T与之的LCP是单调不减的。从左到右扫描sa,当前元素为i,设h=height[i+1]-K+1为当前i与P0(i右边同一组元素中最近的P)的答案贡献。设一个单调递增的栈stack,stack[top].h为栈顶元素与当前P0的答案贡献,stack[top].x为答案贡献为stack[top].h的T元素有多少个。设sum=本组内当前所有扫过的T与P0的总贡献。
若当前元素i为P,ans=ans+sum;
将当前元素加入栈中,维护sum;
- 后缀数组poj2774 poj3415
- hdu1403 poj2774(后缀数组)
- poj2774(后缀数组)
- 后缀数组poj2774
- poj2774 后缀数组
- 后缀数组poj2774(hdu1403)ural1517
- poj2774,hdu1403 lcs 后缀数组,后缀自动机
- poj3415 Common Substrings,后缀数组、单调栈
- [POJ3415]Common Substrings && 后缀数组+单调栈
- POJ3415:Common Substrings(后缀数组+单调栈)
- poj3415 Common Substrings (后缀数组+单调栈)
- poj3415 Common Substrings (后缀数组+单调队列)
- POJ3415 Common Substrings 【后缀数组 + 单调栈】
- 后缀数组小结--poj2406,poj3693,poj2774,poj1743
- poj2774 后缀数组 公共子串
- POJ2774《Long Long Message》方法:后缀数组
- POJ2774:Long Long Message(后缀数组)
- 【后缀数组】【poj2774】【 Long Long Message】
- Java引用类型
- 微软服务器虚拟化
- 去除inline-block元素间间距的N种方法
- linux自动发邮件
- MySQL存储过程
- 后缀数组poj2774 poj3415
- ios xcode 下 报出 ”xx“is missing from working copy 的问题
- R语言绘图篇(三)
- 练习水仙花数
- Leetcode【12】:Inter to Roman
- Ch2_面试基础知识——面试题2:实现Singleton模式
- zigbee帧类型
- 设置windows程序客户区大小(个人感觉很好用以后就直接拿来用得了)
- java中HashMap和Hashtable的区别