2012年2月6日
摘要: POJ_3693 这个题目和SPOJ_687差不多,基本的思路可以参考罗穗骞的论文和我的SPOJ_687的题解http://www.cnblogs.com/staginner/archive/2012/02/06/2340521.html。 对于字典序最小这一条件,我没有想到太好的解决策略,只是默认r[L*i]在第一循环节内,然后向前枚举第一个循环节的首字符的位置,如果此时repetition number和max相等,那么就将这个字符串记录下来,如果比max大,就更新max,并把记录的可能的解清零后再将这个字符串记录下来,如果比max小就直接break,而不用再继续向前枚举第一个循环节首字符 阅读全文
posted @ 2012-02-06 21:47 Staginner 阅读(1243) 评论(0) 推荐(0) 编辑
摘要: SPOJ_687 这几天写了好多字的解题报告了,这次就偷懒一点吧,其实基本的思路在罗穗骞的论文里已经说得比较清楚了。 其中值得一提的是,论文里说过这样一句话“所以只需看字符r[L*i]和r[L*(i+1)]往前和往后能匹配到多远”,对于往后能匹配到多远,这个直接根据最长公共前缀就能很容易得到,而对于往前能匹配到多远,我们当然可以一开始就把字符串反过来拼在后面,这样也能根据最长公共前缀来看往前能匹配到多远,但这样效率就比较低了。 其实,当枚举到合适的子串长度时,我们在枚举r[L*i]和r[L*(i+1)]的过程中,必然可以出现r[L*i]在第一个循环节里,而r[L*(i+1)]在第二个循环节.. 阅读全文
posted @ 2012-02-06 19:02 Staginner 阅读(1626) 评论(1) 推荐(1) 编辑
摘要: POJ_3368 本来想找个RMQ问题练一下今天刚学的ST算法,结果这个题我用ST做不出来,所以只好又用回线段树解法了。 当然dicuss里面有人说也可用ST去做的,我就只说一下我用线段树去做的思路吧。 首先,如果a[i]==a[j]的话,自然输出j-i+1就可以了,如果a[i]!=a[j],如果我们直接查询a[i]、a[j]之间的所有整数出现的频率的最大值,显然是有问题的,因为这样可能会将值等于a[i]或a[j]但序号并不在i~j的范围的整数也统计在内。于是,我们便有了一个思路,在统计a[i]、a[j]之间的所有整数出现的频率的最大值之前,能不能修改一下a[i]和a[j]出现的频率,使... 阅读全文
posted @ 2012-02-06 15:41 Staginner 阅读(442) 评论(0) 推荐(0) 编辑
摘要: POJ_3415 不妨设首字符在第一个字符串里的后缀为A类后缀,首字符在第二个字符串里面的后缀为B类后缀。首先要将两个字符串合并为一个字符串并用分隔符隔开,然后处理出height数组。对于任意一个A类后缀i,和任意一个B类后缀j,假设其公共前缀的长度为k,这两个后缀所能贡献出的S集合里的元素的数目就是k-K+1,当然前提是k>=K。 但是按这样的思路,即便求k时利用height数组的性质及RMQ问题的算法,最后也只能做到O(n^2)复杂度。于是必须优化计算k的过程的时间复杂度。 接下来先要对前面的思路做一个等价的转化,我们选择顺序遍历两次height数组,第一次遍历的时候如果遇到B类后缀 阅读全文
posted @ 2012-02-06 01:34 Staginner 阅读(723) 评论(0) 推荐(0) 编辑