摘要: 后缀数组+二分 中间加个字符,然后二分判断即可 #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], 阅读全文
posted @ 2017-07-16 16:55 19992147 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 二分+后缀数组 并查集怎么做? 二分长度,然后扫描一遍,如果lcp比值大,那么肯定能满足这个x,因为lcp比x大说明包含长x的lcp #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; con 阅读全文
posted @ 2017-07-16 16:30 19992147 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 后缀数组+单调栈 看了好长时间,最后看了张神的程序才搞懂 意思就是求所有子串*n*(n+1)/2 n是子串出现次数 事实上,lcp可以看成宽度为1,高度为lcp值的长方形,所有lcp放在一起就是一堆长方形放在一起,然后我们就要求对于每个高度对应的长方形的面积乘上一个值 每个长方形可以用单调栈求,也就 阅读全文
posted @ 2017-07-16 13:06 19992147 阅读(538) 评论(0) 推荐(0) 编辑
摘要: 后缀数组+st表+单调栈 这道题是差异的加强版 看起来和差异差不多,但是询问的位置是不连续的,那么我们让他们连续就行。 把每个位置赋成rank值,因为lcp[i]表示rank=i和i+1的最长公共前缀,然后st表处理出相邻两个rank的lcp值,然后和差异一样,单调栈处理最左端和最右端的区间,乘起来 阅读全文
posted @ 2017-07-16 12:45 19992147 阅读(221) 评论(0) 推荐(0) 编辑
摘要: st表 我还不会st表 f[i][j]表示[i,i+2^j)区间的最值 构造就像lca一样f[i][j]=f[i][j-1] f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]) 表示[i+2^(j-1)) [i+2^(j-1), i+2^j) 然后查询找出一个2的 阅读全文
posted @ 2017-07-16 12:18 19992147 阅读(167) 评论(0) 推荐(0) 编辑