摘要: [bzoj][1] [luogu][2] sol 按照$Height[i]$从大到小的顺序合并$SA[i]$和$SA[i 1]$。 考虑合并两个集合对答案的贡献。 方案数会增加$sz[x] sz[y]$ 最大值可以被$max(mx[x] mx[y],mn[x] mn[y])$更新 code cpp 阅读全文
posted @ 2018-02-24 22:10 租酥雨 阅读(168) 评论(0) 推荐(0) 编辑
摘要: [bzoj][1] [luogu][2] sol 首先把两个串拼在一起跑后缀数组。中间插入一个没有出现过的字符。 求完后缀数组之后考虑$O(n^2)$暴力统计:枚举前一个串和后一个串的两个位置,$ans+=lcp(i,j)$。 现在改为把一共$2n$个后缀按$Rank$顺序插入,每插入一个后缀,统计 阅读全文
posted @ 2018-02-24 21:57 租酥雨 阅读(165) 评论(0) 推荐(0) 编辑
摘要: BZOJ权限题qwq [Luogu][1] sol “两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串” 其实就是差分一波以后完全相同 所以对输入的数据进行差分,同时记一下每一个位置是属于哪个串的。 记得在串与串中间加入一个没有出现的字符。 求出SA后二分答案$mid$,问题变成:$He 阅读全文
posted @ 2018-02-24 21:48 租酥雨 阅读(150) 评论(0) 推荐(0) 编辑
摘要: [Luogu][1] 一句话题意 给出一个串,求至少出现了$K$次的子串的最长长度。 sol 对这个串求后缀数组。 二分最长长度。 如果有$K$个不同后缀他们两两的$lcp$都$ =mid$ 那么他们在$SA$中一定排在连续的一段区间,且两两之间的$Height[i] =mid$ 所以判断$Heig 阅读全文
posted @ 2018-02-24 21:40 租酥雨 阅读(247) 评论(0) 推荐(0) 编辑
摘要: [vjudge][1] 一句话题意 给两个串,求最长公共子串。 sol 把两个串接在一起求后缀数组。其实中间最好用一个没有出现过的字符连接起来。 判断如果$SA[i]$和$SA[i 1]$不属于同一个串的话就可以拿$Height[i]$更新答案 code cpp include include in 阅读全文
posted @ 2018-02-24 21:31 租酥雨 阅读(154) 评论(3) 推荐(0) 编辑
摘要: 后缀数组总结 学习后缀数组可以参考2009年国家集训队论文《后缀数组——处理字符串的有力工具》BY罗穗骞 这里只有代码 cpp const int N = 1e6+5; char s[N]; int n,a[N],t[N],x[N],y[N],SA[N],Rank[N],Height[N],ans; 阅读全文
posted @ 2018-02-24 21:27 租酥雨 阅读(206) 评论(0) 推荐(0) 编辑
摘要: [bzoj][1] [luogu][2] sol 我不得不说这道题很码。。。 求$lcp$的话当然先来一发后缀数组+ST表。 可以二分一个答案$mid$,可知序列中与$c$的$lcp$大于等于$mid$的后缀肯定是$Rank$上的连续一段。 再二分一下找出这一段的左端点和右端点,设为$[up,dow 阅读全文
posted @ 2018-02-24 20:07 租酥雨 阅读(207) 评论(0) 推荐(0) 编辑
摘要: [bzoj][1] [luogu][2] sol 显然对于n个不同的数不好处理排序吧。 那什么情况下方便处理呢?只有0或1? 二分一个答案$mid$,把所有小于等于$mid$的数全部设为1,大于$mid$的数全部设为0。 然后就只要按要求排序就行了。用线段树维护01序列的排序,相信大家都会。 最后只 阅读全文
posted @ 2018-02-24 19:53 租酥雨 阅读(238) 评论(0) 推荐(0) 编辑