后缀数组
文章平均质量分 78
glq007
muyou
展开
-
UVA 11107 Life Forms(后缀数组+LCP)
题意是给出N个串,求在超过一半串中出现的最长公共序列。第一道后缀数组,方法是把每个串加个#连起来,然后求SA和height,二分最长公共序列长度L,遍历height数组,两两之间LCP大于等于L就算一组,如果碰到个小于L或者后一个到#了(因为#的数字要比字母大所以就是到最后了)那么上一组就要结算了,如果个数大于n/2,那么就可以,然后范围缩小到mid+1,y(因为可能有更长的),反之范围到,x原创 2014-12-18 15:40:44 · 817 阅读 · 0 评论 -
UVA 10829 L-Gap Substrings(后缀数组)
题意就是找出一个串中形如UVU格式的字符串有几个。枚举U的长度L,利用类似poj3693一样的做法,对于位置i和位置i+g+L先向后匹配再向前匹配,为了不重复,像后匹配长度不能超过L,向前匹配不超过L-1,然后答案加上匹配总长度-L+1。总复杂度o(nlogn)AC代码://#pragma comment(linker, "/STACK:102400000,102400000")原创 2014-12-26 01:21:43 · 1354 阅读 · 0 评论 -
POJ 3693 Maximum repetition substring(后缀数组)
题意就是求一个串里重复最多的连续子串。想了许久没有思路,看了罗论文的解法后总算理解了。枚举那个不断重复的子串长度为L,然后就在0,l,2×l,。。找跟后面的匹配点。但是会出现这种情况。比如qcabcabcab,假设枚举L为3,那么在0处与3处比较不一样,3处b与6处的b一样了。其实可以先确定一点,如果这个串里有长度为L的重复串,那么像刚才0,l,2×l这样枚举是一定会枚举到一样位置的,但是不一原创 2014-12-26 01:15:35 · 644 阅读 · 0 评论 -
poj 3415 Common Substrings(后缀数组+单调栈)
题意:给2个串,求2个串的后缀之间公共串长度>=k的对数。做法:单调栈维护3个东西,一个是height,一个是在之上到前一个元素(其实包括这个前一个元素)之间另一个串后缀的个数,还有个位置。用dp[i]代表rank为第i个串与之上所有另一个串后缀>=k的对数。那么在加入新串的时候,先出栈height大于当前的,同时统计这之间有多少另一个串后缀的个数x,然后一直出到小于当前height为止,设这原创 2015-04-24 02:22:06 · 649 阅读 · 0 评论 -
CSU 1608 Particle Collider(二分+后缀数组)
题意:一个子串和他的反串在所有串中的出现次数大于一半,则输出该子串,如果有多个,按字典序排序。做法:把所有串和他的反串拼起来构造后缀数组。用一个标记数组,把正着的串的每个位置标上这个串的编号。二分长度,按照rank值大小找height>=h的最长区间,可以利用位运算来代表在正串中出现了几次,如果在正串中没出现过那么就不用加入map里了,如果出现过,我们还要把串反过来看看map里有没有,如果有说原创 2015-06-02 20:33:59 · 656 阅读 · 0 评论