随笔分类 - 字符串--后缀数组
摘要:题面 "传送门" Sol 二分这个最长前缀的长度 考虑$check$ 首先$s[a..b]$以$i$开头子串如果要满足和$s[c..d]$的$LCP =mid$ 那么$i$肯定是在后缀数组的$rank$的一个区间内 这个区间显然可以二分/倍增出来 $i$同时还要满足$b i+1 =mid$和$i =
阅读全文
摘要:题面 "Bzoj" Sol 刚完品酒大会那道题后再看这道题发现这就是道$SB$题 后缀数组+并查集 按$height$从大到小做 $height$是两个相邻$rank$的后缀的$LCP$ 从大到小,那么每次合并$height$的两边的集合,同时记录答案 两边集合两两配对的$LCP$一定就是这个$he
阅读全文
摘要:题面 "Bzoj4199" Sol 后缀数组 显然的暴力就是求$LCP$+差分 $40$分 cpp include define RG register define IL inline define Fill(a, b) memset(a, b, sizeof(a)) using namespac
阅读全文
摘要:题面 "Bzoj" Sol 两个串拼在一起后求出后缀数组 然后显然的$n^2$暴力,就是直接枚举求$LCP$ 又由于扫的时候是对$height$取$min$ 那么可以用单调栈维护每一段的贡献相同的
阅读全文
摘要:题面 "传送门" Sol 求个以$i$为结尾的$AA$串的个数和以$i$为开头的$AA$串的个数 乘法原理即可,暴力求有95分 而你会发现,枚举l,经过$i$和$i+l$的只要算出它左右各能扩展到哪里,然后这个区间内的都要$+1$ 差分一下+后缀数组 cpp include define RG re
阅读全文
摘要:题面 "有权限号的去看吧" "Luogu" Sol 差分后就是求多个串的最长公共子串 套路啊 拼在一起用不同字符隔开,后缀数组,二分答案,分块height,开桶记录即可 ~~我把差分值离散了~~
阅读全文
摘要:题面 "Vjudge" "Vjudge" Sol 求一个串不同子串的个数 每个子串一定是某个后缀的前缀,也就是求所有后缀不同前缀的个数 每来一个后缀$suf(i)$就会有,$len sa[i]+1$的新的前缀,又由于有$height$个重复的,那么就是$len sa[i]+1 height$的贡献
阅读全文
摘要:题面 "Hihocoder" "Vjudge" Sol 题目的提示说的也非常好 我对求$LCP(P L + len \% l, P + len \% L)$做补充 $len=LCP(P, P + L)$ 为什么只要求$LCP(P L + len \% l, P + len \% L)$呢? 考虑在$
阅读全文
摘要:题面 求多个串的最长公共子串 Sol 套路,拼在一起,二分答案+后缀数组判定 把大于答案的$height$分组,然后计算出一个组内是否有所有串的后缀 由于串只有$5$个开个桶就好了
阅读全文
摘要:题面 "HiHocoder1415 " "Poj2774" Sol 都是求最长公共子串,$hihocoder$上讲的很清楚 把两个串拼在一起,中间用一个特殊字符隔开 那么答案就是排序后相邻两个不同串的后缀的$height$ 为什么呢? 如果答案为不相邻的两个后缀的前缀,计算它们最长前缀时必定要跨越过
阅读全文
摘要:题面 "vjudge" Sol 二分答案+分组,判断有没有一个组的后缀个数不小于 k "做法"
阅读全文
摘要:题目 "vjudge" Sol 先差分 然后求 "不可重叠最长重复子串" ~~bits/stdc++.h会CE~~
阅读全文
摘要:前言 "一道模板题" 后缀数组(SA)是一个比较强大的处理字符串的算法,是有关字符串的比较基础~~是吗?~~算法,所以必须掌握 实现主要有倍增和$DC3$,而我~~太弱了~~只学了倍增 目录 知识点 1.基数排序+倍增 2.最长公共前缀Height 一些要维护的东西 $s$:就是这个字符串,长度为$
阅读全文

浙公网安备 33010602011771号