poj 2185

与next[],相关的常用用法.1:求字符串的重复数.当while(i%i-next[i]==0),重复数为(i/i-next[len];) 练习题(poj 2406 1961)

2:len-next[len]为一个重复子串的基串个数,比如a表示基串,a^k,第一个用法求的是k,而第二个求的是a的个数.

值得注意的是ababa的基串也为2,为什么?自己想想哈.

3.深刻理解next的含义.练习题(poj 2752)

 

 

思路:KMP很好的一道题。首先易证:最小覆盖子矩阵一定靠左上角。那么,我们考虑求出每一行的最小重复串长度,所有行的最小重复串的长度的lcm就是最小重复子矩阵的宽。然后我们对列也做相同的操作。于是我们就可以求得最小重复子矩阵的大小了。(这里要注意一点:当所得的宽大于原来的宽时,就让等于原来的宽,长也如此)。算法实现:算法的核心在于高效的求出每一行和每一列的最小重复串,这个可以最原串做一次KMP中的get_next()。(注:以上部分为转载)

 

这道题对我这个字符串菜鸟来说实在是有些难;一来是就想来个暴力,但想了想,

可定超时,于是看了discuss,用KMP来优化,求每一行每一列的求最小覆盖;

但是我完全没有思路,看了一下解题报告,原来才知道用的是第二类KMP求next

数组,算法是理解了,

但是对于为什么最小覆盖就等于i-next[i]还不懂???

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值