随笔分类 -  数据结构

摘要:HDU-5853 Jong Hyok and String (广义后缀自动机) 题意:给定一些串,每次查询一个串,求所有的 (在所有串中$endpos$都与它相同的),(出现在给定串的)不同子串个数 广义后缀自动机? 是不是听起来很高大上? 博主当然不明白原理,但是mo有关系 对于处理多个串的子串问 阅读全文
posted @ 2020-01-20 09:32 chasedeath 阅读(159) 评论(0) 推荐(1)
摘要:HDU-4416 Good Article Good sentence (后缀自动机) 题意:给定一个串$A$和若干串$B_i$,求出现在$A$中且不出现在$B$中的子串个数 这个题我们不能把$B_i$接在一起做,会直接MLE! 对于$A$构建$SAM$ 考虑对于每个$B_i$把出现在$B_i$中的 阅读全文
posted @ 2020-01-20 09:21 chasedeath 阅读(166) 评论(0) 推荐(0)
摘要:LOJ-2033.[SDOI2016]生成魔咒 (后缀自动机) 直接一点就后缀自动机了。。。 注意要开$map$存储状态转移 每次加入一个新的字符就加上新的状态的子串数量$len[new]-len[link[new]]$ #include<bits/stdc++.h> using namespace 阅读全文
posted @ 2020-01-20 09:08 chasedeath 阅读(139) 评论(0) 推荐(0)
摘要:POJ-3693 Maximum repetition substring (后缀数组) 题意:求连续重复次数最多的子串 一个连续重复子串可以描述为$l,r,len$(端点,循环节长度) \(O(n^2)\):直接枚举$l,len$,然后求$l$和$l+len$的$LCP$,就能得到最大的$r$ 考 阅读全文
posted @ 2020-01-19 15:16 chasedeath 阅读(104) 评论(0) 推荐(0)
摘要:POJ-3294 Life Forms (后缀数组) 要按照字典序输出的话后缀自动机就比较麻烦了,所以没有 把所有字符串接在一起,中间用不同的奇怪的字符隔开 二分答案$x$,将$LCP$数组分组使得每组中的$LCP\ge x$,找一下是否一半的串都在这组中出现过了即可 输出注意格式 #include 阅读全文
posted @ 2020-01-19 14:50 chasedeath 阅读(102) 评论(0) 推荐(0)
摘要:POJ-1743 Musical Theme (后缀系列) 由于有着所谓的升降调(?),所以可以理性地想到先作差 然后就是要统计最长的 至少不重叠地出现两次的 子串 注意有个Trick : 小于5不能输出! \(\ \) 后缀数组 依然地我们先二分答案$x$, 对于$LCP$数组分组,每组之内$LC 阅读全文
posted @ 2020-01-19 14:42 chasedeath 阅读(133) 评论(0) 推荐(0)
摘要:Luogu-2852 [USACO06DEC]牛奶模式Milk Patterns (后缀系列) 题意:求至少出现了$k$次的最长子串 后缀数组 二分长度$x$ 我们可以将$LCP$数组分段,每段内的$LCP[i]\ge x$,那么出现这些后缀长度为$x$的前缀均相同,然后统计每段最多包含几个后缀即可 阅读全文
posted @ 2020-01-19 14:27 chasedeath 阅读(106) 评论(0) 推荐(0)
摘要:HDU-5008 Boring String Problem(k大子串,后缀系列) 这个题似乎没有办法用后缀自动机写。。。 \(\ \) 后缀数组 由于后缀数组已经排好序,所以可对于$sa[i]$考虑其贡献的个数为$n-sa[i]+1-lcp[i-1]$ 考虑个数累前缀和$Sum[i]$,二分就$S 阅读全文
posted @ 2020-01-19 14:15 chasedeath 阅读(155) 评论(0) 推荐(0)
摘要:POJ-2774 Long Long Message (最长公共子串,后缀系列结构) 后缀数组 将两个串接在一起,中间加上一些奇怪的字符 然后就是求下标分别落在两个串中的所有$i,j$中$LCP(Suf_i,Suf_j)$的最大值 按照$SA$的顺序可以发现只用考虑最近的$i,j$,所以对于每个 \ 阅读全文
posted @ 2020-01-19 14:06 chasedeath 阅读(208) 评论(0) 推荐(0)
摘要:SPOJ-DISUBSTR - Distinct Substrings(后缀系列结构) 这是一个非常基础的模型了 后缀数组做法就是$Ans=\sum n-sa[i]+1-lcp[i-1]$ 这题后缀自动机和后缀树没有什么特别大的差别 后缀自动机有两种做法 欢迎跳转总结博客 SA: #include< 阅读全文
posted @ 2020-01-19 13:39 chasedeath 阅读(131) 评论(0) 推荐(0)
摘要:后缀数组&自动机&树 后缀系列字符串结构总结 博主的一些习惯 字符串叫$S$,长度叫$n$,字符串$a,b$相接为$a+b$,下标从一开始,$S_{i,j}$表示$i$到$j$这一段子串 字符串之间$<,>$表示字典序比较 所有例题的题解都可以在文末找到 \(\ \) \(\ \) 1: SA(后缀 阅读全文
posted @ 2020-01-19 13:28 chasedeath 阅读(303) 评论(0) 推荐(1)
摘要:[IOI2007] sails 船帆 线段树或者其他数据结构维护贪心 分析问题,其实就是要合理安排旗子使得每一行的旗子个数较平均,答案就是$\sum{cnt[i]*(cnt[i]-1)/2}$ 考虑高度较低的旗杆放旗子比较不灵活(?),所以我们先让较低的放,不齐的由较高的旗杆补 对于$h,k$,我们 阅读全文
posted @ 2019-11-09 12:26 chasedeath 阅读(207) 评论(0) 推荐(0)
摘要:[NOI2010]超级钢琴 提供两种写法 Part 1 - > \(n log ^2 n\) $k$大问题常用思想,二分答案 离散后用树状数组维护左边$j \in [i-R,i-L]$距离内的前缀和(\(Sum\))的值满足$Sum_i-Sum_j \ge Ans$的个数 这是一种非常套路的写法 最 阅读全文
posted @ 2019-11-09 12:12 chasedeath 阅读(134) 评论(0) 推荐(0)
摘要:CF280D k-Maximum Subsequence Sum 线段树维护贪心 要取$k$次,考虑贪心策略如下 先取最大的连续子段,然后有两种决策: ​ 1.从原来的某一段已经被取的连续子段中取一段最小的断开那个子段 ​ 2.另取一个子段 (非常有道理对吧) 接下来考虑用线段树优化这个贪心问题 其 阅读全文
posted @ 2019-11-09 11:10 chasedeath 阅读(170) 评论(0) 推荐(0)
摘要:Link Cut Tree LCT专题总结 Part 1 LCT 原理介绍 (以下均为个人见解) LCT是一种树链剖分,奇怪的树链剖分 根据我的认知,LCT是基于将整颗树随机地剖成若干条能够动态改变的链,每条链均是一条到达祖先的路径 整棵LCT就是由这样的链构成,并且这些链可以动态重构和连接 LCT 阅读全文
posted @ 2019-10-14 22:02 chasedeath 阅读(295) 评论(0) 推荐(0)
摘要:\(Splay Tree\) $Splay$是一种非常诡异的数据结构 核心:二叉搜索树 优化:复杂度均摊$O(nlog n)$ 优化操作:Splay操作 在刚学$Splay$时不建议看它的势能分析,因为并没有什么卵用 引入 二叉搜索树(\(BST,Binary Search Tree\)): 核心性 阅读全文
posted @ 2019-09-26 10:55 chasedeath 阅读(252) 评论(1) 推荐(0)
摘要:AC自动机总结 AC自动机简述 功能 多模板串对单个或多个串的匹配问题 主体思想 原理同$kmp$ , 在$trie$树上使用变种的$kmp$ 实现 需要数组 : \(trie[N][26],fail[N]\) $fail$即我们所说的失配函数,$trie[]$则略有变更 准确一点得说,$fail$ 阅读全文
posted @ 2019-09-16 21:53 chasedeath 阅读(583) 评论(3) 推荐(1)
摘要:线段树技巧 Part 1: 简单的常数优化 1.非递归线段树 你可以不用zkw,只用每次单点操作时直接像打二分样写下去就好了 以单点求和为例 int Que(int p,int l,int r,int x){ if(l==r) return Sum[p]; int mid=(l+r)>>1; Dow 阅读全文
posted @ 2019-09-02 15:01 chasedeath 阅读(479) 评论(0) 推荐(0)
摘要:ZOJ - 2112 \(\ \) (那些说这道题是树状数组套主席树的人一定对主席树有误解!) 这里我们用树状数组套线段树来解决来写 首先 , 我们需要有n棵线段树(不是$n^2$空间,别慌) 我们用这些线段树存储值域$ [l,r] $内数的个数 基于主席树的思想,我们的线段树是要相减的,记录的是前 阅读全文
posted @ 2019-07-28 16:07 chasedeath 阅读(255) 评论(0) 推荐(0)
摘要:Count On A Tree 建立线段树记录每个$[1,u]\(路径上的前缀中在值域\)[L,R]$中的个数 查询时 计算 \(cnt[x]+cnt[y]-cnt[lca]-cnt[fa[lca]]\) const int N=1e5+10,P=1e9+7; int n,m; int s[N*20 阅读全文
posted @ 2019-07-28 16:06 chasedeath 阅读(183) 评论(0) 推荐(0)