BZOJ 4698 差分+后缀数组】的更多相关文章

思路: 对所有序列差分一下 公共串的长度+1就是答案了 二分 扫一遍height即可,.. //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ; ,top,s[N*N],pos[N*N],A[N*N],B[N*N],cntA[N*N],cntB[N*N],sa[N*N],rk[N*N],tsa[N*N],ht[N*N],vis[N];…
P2743 乐曲主题Musical Themes(poj1743) 然后呢这题思路其实还是蛮简单的,只是细节特别多比较恶心,忘记了差分带来的若干疏漏.因为转调的话要保证找到相同主题,只要保证一段内相对的差值不变,所以自然而然想到差分.注意细节.1.因为差分会带来负数,而负数在后缀数组里最初排名是会出问题的,所以要全搞成正的,+100即可2.因为最后一位不可以计算入差分数组里,所以不算,n要减1,同时二分答案后要记得把求得的最长差分长度加上一才是原数组长度3.最坑的地方是找不重复的最长字串,自然套…
CF原题(http://codeforces.com/blog/entry/4849, 204E), CF的解法是O(Nlog^2N)的..记某个字符串以第i位开头的字符串对答案的贡献f(i), 那么f(i-1)>=f(i)-1, 然后就是O(NlogN)了, 但是速度垫底了....被后缀自动机完爆了... ----------------------------------------------------------------------------------------------…
题目大意 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T.\(len \leq 200000\) 题解 我们从归并排序的角度去想,每次把两者之一较小的取出来 遇到相等的元素的时候,排序时取那个都是一样的. 但是在这道题中我们是求字典序最小,这就不一样了. 我们不能任意取,这一步的决策其实是由后面的数字的大小决定的 怎么说呢... 方法蕴藏在这三张图里了,自己去悟吧. 黑色箭头表示选取,黑色圆圈表示确定选取序列的理由. 迭代第一次 迭代第二次 迭代第三次…
题目传送门 传送门 题目大意 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串 先用奇怪的字符把所有字符串连接起来. 建后缀树,数每个节点的子树内包含多少属于不同串的后缀. 数这个东西,可以将每个串的后缀(被奇怪的字符分割开的地方认为它属于不同后缀)按dfs序排序,然后简单容斥就能统计出来. 对于每个后缀,有贡献的是一个前缀,然后直接统计就行了. Code /** * bzoj * Problem#3473 * Accepted * Time: 788…
题目链接:http://poj.org/problem?id=1743 首先,musical theme只与前后位置的增减关系有关,而与绝对的数值无关,因此想到做一次差分. 然后对于差分后的数组,找到最长的出现两次(或两次以上)的一个子串即可.这个如果说两个子串可以交叉的话就好做了,直接取height的最大值即可,但是题目要求不能交叉,前几天一位师兄讲课刚讲了,可以用二分做.对于一个指定长度L,判断它是否可行,就用这个L去划分height数组,对于每个部分的分别看看最远的两个是否没有交叉就可以了…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4310 二分答案——在本质不同的子串中二分答案! 如果二分到的子串位置是 st,考虑何时必须分出一段: 如果一个位置 i 有 rk[i] < rk[st],那么显然不用管( i 后缀的开头): 而如果 rk[i] > rk[st],则 i+1 ~ i+LCP 之间必须有一处断开: 比较麻烦的是这样只保证了 i 这个后缀的开头不会产生大于二分子串的子串,但后面怎么办? 这时就又需要考虑到——…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4278 每次取两个后缀中字典序较小的那个的首字符: 注意超出去的部分是 inf 而不是 0,因为如果到了比较超出去部分的时候,那就是一个串走到了末尾而另一个没有(或者都到末尾,不过都到末尾就随便选啦),而且两个后缀的 LCP 顶到了末尾: 这时选长度较长的比较优,因为反正 LCP 处一样,先选较短的等选完以后还是得过来,不如先选较长的,也许后面还出现更优的. 代码如下: #include<i…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4310 答案有单调性? 二分出来一个子串,判断的时候需要满足那些字典序比它大的子串都不出现! 原来想的是在 sa[ ] 上二分找到最右端 j ,满足自己到 j 之间的位置与自己的 LCP >= ans_len :然后从前往后遍历,如果走到一个位置 k 发现它的 sa[ ] 是在那个 LCP >= ans_len 的区间内的,则需要把它截断:可以在 k ~ k+ans_len-1 之间选一个…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4556 就是找一个 rk 在一段区间内的前驱和后继: 由于 LCP 还有区间长度的限制,所以可以先二分答案! 然后直接建立 rk 的主席树,查询即可. 代码如下: #include<cstdio> #include<cstring> #include<algorithm> #define mid ((l+r)>>1) using namespace st…