后缀数组的模板。这样说明就非常具体了吧! /* * 后缀数组模板-倍增法 * 用法: * 1、读取字符串转换成int数组。长度为len。下标从0開始 * 2、在字符串末尾加一字典序最小字符,一般为0,并找到最大的字符设为maxa * 3、调用函数da(num,sa,len+1,maxa+1) * 求 ...
分类:
编程语言 时间:
2017-07-23 21:02:02
阅读次数:
163
题目链接:https://vjudge.net/contest/70655#problem/C 后缀数组的又一神奇应用。不同子串的个数,实际上就是所有后缀的不同前缀的个数。 考虑所有的后缀按照rank排好了,我们现在已知height,也就是相邻的两个的最长公共前缀是多少。那么不同的子串个数怎么统计呢 ...
分类:
编程语言 时间:
2017-07-23 10:00:22
阅读次数:
172
题目链接:http://poj.org/problem?id=3261 这个是可以交叉的重复串,所以用height就可以了,但是题目说让重复k次以上,也就是直接做一个k-1长度的滑窗最小值,从这些最小值里取最大即可。 这里其实为了节省空间可以先给数字离散化一下,这样就只有20000了,不过不离散化空 ...
分类:
编程语言 时间:
2017-07-23 00:51:57
阅读次数:
226
题目链接:http://poj.org/problem?id=1743 首先,musical theme只与前后位置的增减关系有关,而与绝对的数值无关,因此想到做一次差分。 然后对于差分后的数组,找到最长的出现两次(或两次以上)的一个子串即可。这个如果说两个子串可以交叉的话就好做了,直接取heigh ...
分类:
编程语言 时间:
2017-07-22 23:52:14
阅读次数:
300
题意:一道论文题,给定一串数组,求最长的重复子串长度,其中这两个子串不重叠,这两个子串可以相差同一个数字。 分析:后一个减前一个数字,那么对于上面说的,可以相差同一个数字就变成了相同数字。问题就变成了,求一个串里面的最长不可重复的子串长度。 但是不再是height数组里面的最大值了,二分答案,将he ...
分类:
编程语言 时间:
2017-07-22 16:56:01
阅读次数:
190
1031: [JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考。一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法。例如下图,可以读作: JSOI07 SOI07J OI07JS ...
分类:
编程语言 时间:
2017-07-19 14:33:32
阅读次数:
182
先明白 基数排序 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为 ...
分类:
编程语言 时间:
2017-07-19 01:12:09
阅读次数:
214
传送门:http://hihocoder.com/problemset/problem/1415 【题解】 考虑求出两串合在一起(中间加分隔符)后缀数组,就是要求任意在两个串中的$i, j$,$\min\{h_k\} (i \leq k \leq j)$的最大值。 考虑$i, j$一定是满足$|i ...
分类:
编程语言 时间:
2017-07-18 10:10:50
阅读次数:
140
后缀数组+二分 中间加个字符,然后二分判断即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 100010; int n, top, k, tot, m, ans; int a[N], ...
分类:
其他好文 时间:
2017-07-16 17:22:00
阅读次数:
183
后缀数组+单调栈 看了好长时间,最后看了张神的程序才搞懂 意思就是求所有子串*n*(n+1)/2 n是子串出现次数 事实上,lcp可以看成宽度为1,高度为lcp值的长方形,所有lcp放在一起就是一堆长方形放在一起,然后我们就要求对于每个高度对应的长方形的面积乘上一个值 每个长方形可以用单调栈求,也就 ...
分类:
其他好文 时间:
2017-07-16 14:21:33
阅读次数:
300