![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
后缀数组
getupdown
这个作者很懒,什么都没留下…
展开
-
Milk Patterns POJ3261 (后缀数组)
后缀数组第一题。 这道题要的是 重复至少K次的 最长子串。 先把后缀数组中的height数组处理出来,这个套模板就可以了。然后接下来二分答案ans,然后扫描height数组,看看有没有是否有k-1个height[i]>=ans 有的话就是可以,否则继续做。关于模板有个要注意的地方: (至少我手上的是这样),需要在待处理数组后面加一个比所有字符都小的数字/字符,这样是为了防止无法比较。例如 2原创 2016-08-15 18:03:09 · 242 阅读 · 0 评论 -
Prefixes and Suffixes - Codeforces432D(后缀数组)
给一个串,找到这样的子串:它既是这个母串的前缀,又是这个母串的后缀。统计这样的串的个数,长度和在母串中总共的出现次数。解法:首先把后缀数组排出来,找到代表母串的那个后缀的rank,这个rank设为st。有一个结论比较重要:“设有一个子串x满足这个条件(它既是母串前缀,又是母串后缀),设这个子串所表示 的后缀 的位置为r。则r上面就必定没有和这个后缀相等的串了。”原创 2017-03-24 22:06:41 · 490 阅读 · 0 评论 -
Hdu 5769 Substrings (后缀数组)
后缀数组的一个功效是统计一个串里多少个不同的子串。 这个题就稍微改了一下,其实大体做法不变。 他要求 至少包含1个指定字母 的子串。 所以反过来想,所有子串 减去 不包含指定的子串 就可以了。 前者是个基本问题,重点是后者。字符串从后向前扫描一遍,处理出每个字符开始,向前延伸最大多少,不包含指定字母(near数组)。 然后就相当于每个后缀都减少了一段,并且要改造height数组。 h原创 2016-12-16 14:04:07 · 311 阅读 · 0 评论 -
Hidden Password (后缀数组,字符串的最小表示法)
据说这个有更快的算法,在这里我是用后缀数组做的。首先把原字符串再复制一次,然后把这个新字符串做后缀数组。 直接排序出来,排第一个的就是答案。 不过这个题还有个要求,就是如果多解,输出最前面的。我是这样处理的。 设输入的字符串是S。 处理成这样:SS+一个最大的字符+0号字符(这个是后缀数组的修正)。 由于字符串的比较特性,碰到最大的字符肯定排到较为后面,而且越后面的后缀越容易先比较到这个大原创 2016-08-24 00:23:45 · 397 阅读 · 0 评论 -
Repeats SPOJ (后缀数组,寻找一个重复次数最多的子串)
思路: 如果说有一个循环节长度为k的字符串出现,那么,字符串里必定有str[0],str[k],str[2*k]….中的至少2个,在那个子串里。所以就直接枚举循环节长度k,向后匹配,向前匹配,看看最长能到几个。向后匹配直接用LCP,RMQ的方法就可以了。 向前匹配,我看有些人是倒置,然后又求了一遍后缀数组。 但其实不用这样,可以用向后匹配的个数。因为,如果要存在循环长度为k的子串,显然最后匹配原创 2016-08-24 00:16:21 · 371 阅读 · 0 评论 -
Substrings poj1226 (后缀数组)
给n个串,找到一个字符串S。 使得,每个串里要么有S,要么有S的反转。首先构造字符串,把每个字符串和其反转连接在一起(这个中间也要用字符分割!!很重要!!),然后用一个字符(不会出现在串里的)分割。然后二分答案,分段数组,检验。答案错误的同学们试试看 1 2 bcbcb bcbcb 这个东西。#include<iostream>#include<cstdio>#include<cst原创 2016-08-19 19:22:06 · 306 阅读 · 0 评论 -
Relevant Phrases of Annihilation SPOJ (后缀数组)
给n个串,要找到一个字符串,这个字符串在这n个串里都出现至少两次,并且不套叠。先把所有的字符串连接起来(注意用一个不会出现在原串里的字符来分割,最好还是用不同的) 然后二分答案ans,去分段height数组,维护每一段里面,n个最大的出现位置和最小的出现位置。 对于这n个串的每个串,最大位置-最小位置>=ans才是可以的(否则要么是只出现一次,要么是套叠) 还有注意特判一下没有出现的情况。详情原创 2016-08-19 19:18:34 · 254 阅读 · 0 评论 -
Power String poj2406(后缀数组+DC3算法)
这题其实应该不是用后缀数组做的。。。但是就当做练习吧。 倍增算法在这里会被卡掉,所以要用DC3算法。。这里我是套模板的。。重点就在于,怎么找这个循环节。 做法是把height数组出来之后,枚举一下长度。 设长度为i,如果满足条件的话。 后缀0(整个串)和后缀i的LCP是 length-i 这个做法很巧妙,学习了。//42704K 2829MS C++ 2709B 2原创 2016-08-16 23:10:05 · 1296 阅读 · 2 评论 -
New Distinct Substrings (后缀数组,统计有多少个不同的子串)
首先要确认一个事实:任何一个子串都是一个后缀的前缀。 根据这个,首先处理出height数组。对于样例:ABABA 后缀数组处理出来是这样的结果。 A 0 ABA 1 ABABA 3 BA 0 BABA 2右边的数字是height数组的值。因为:任何一个子串都是一个后缀的前缀。 所以对于每个后缀就有 n-sa[i]个子串。 这时候从第一个后缀出来的答案是1。 然后看第二个,原创 2016-08-15 18:16:27 · 434 阅读 · 0 评论 -
51nod 1469 淋漓尽致子串
这个题的官方题解是用 后缀自动机 做的,我用后缀数组完成了这道题。首先,我们来定义一下淋漓尽致子串。1.令原串为S。2.设子串的长度为len,在原串S中出现的次数为k,令其出现的位置为p1, p2, ....pk(即这个子串在原串中[pi,pi + len - 1]中出现)。3.若k=1,则该子串不是淋漓尽致子串。4.若存在pi,pj(i != j),使得S[pi原创 2017-05-05 23:28:10 · 418 阅读 · 0 评论