11 2021 档案
摘要:给出一个字符串 询问有多少个子串满足 出现至少两次,且不重叠。 做法: 建出SAM。 对每个节点维护最大的endpos位置L和最小的endpos位置R 然后对每个节点$i$,取$min(R-L,len[i])-len[link[i]]$就是对答案的贡献。 求和即可。 #include<bits/st
阅读全文
摘要:GYM103145L. k-th Smallest Common Substring 给出$n$个字符串。 询问第$k$小的公共子串。 做法: 将每个字符串逆序插入SAM,建出后缀树。 第一个需求,公共子串: 这里可以把每个字符串视为一种颜色,它在SAM上对应的每个终止节点染上这个颜色。 然后问题转
阅读全文
摘要:给出二维平面上的一些点。 询问一个$K\times K$的正方形,最多能覆盖多少点。 做法: 考虑这个正方形的一个角。这个角确定了,正方形也就确定了。 对于一个点,合法的角的坐标范围形成了一个矩形。 问题转化为,求一些矩形的最大重合点是多少。 扫描线即可。 时间复杂度O(nlogn)。 //对一个点
阅读全文
摘要:定义一条路径的权值为路径上所有边的编号直接相连所得到的十进制数字大小。 求1到每个点最短路mod \(10^9+7\) 做法: 每一条边可以按数位拆成若干个点。 bfs的时候,前面距离完全相同的点需要合并。 这种涉及字典序的题,都可以这样做。 细节非常多: #include<bits/stdc++.
阅读全文
摘要:给出一个数组$a$,若子串$a[l,r]\(满足\)[1,r-l+1]$各出现一次,则称其为这个数组的一个子排列。 求这个数组的子排列个数。 做法: 观察到一个子区间$[l,r]$是一个排列,等价于: $[l,r]$没有重复的数字。 $[l,r]$中的最大值为$r-l+1$。 用单调栈处理出每个数作
阅读全文
摘要:给出节点数为$n$,边数为$m$的图。 保证每个点对都是互连的。 定义彩虹路:这条路经过$k$个节点,对于$x(x%2=0)$的节点,左右两条边颜色相同。 现在有$q$次操作。 第一种操作是添加一条边。 第二种操作是回答是否能经过彩虹边从$a$节点到达$b$节点。 做法: 能相互到达的点用并查集连起
阅读全文
摘要:P6793 [SNOI2020]字符串 给出两个长度为$n$的字符串$a,b$,取出他们所有长为$k$的子串(各有$n-k+1$个),这些子串分别组成集合$A,B$。 现在要修改$A$中的串,使得$A$和$B$完全相同。 可以任意次选择修改$A$中的一个串的一段后缀。花费为这段后缀的长度。 总花费为
阅读全文
摘要:P4248 [AHOI2013]差异 给出一个长度为$n$的字符串$S$,令$T_i$表示它从第$i$个字符开始的后缀,求: \(\sum_{1\leq i<j\leq n}len(T_i)+len(T_j)-2\times lcp(T_i,T_j)\) 做法: 对反串建后缀树。 后缀树的边权记为$
阅读全文
摘要:给你一个串$S$,以及一个字符串数组$T_{1,2,...m}$,$q$次询问,每次问$S$的子串$S[p_l,...p_r]$在$T_{l...r}$中的哪个串的出现次数最多,并输出出现次数。 做法: 对串$S$和数组$T$建立后缀自动机。 在后缀自动机上找到$S[l,r]$这个子串对应的节点u,
阅读全文
摘要:[HEOI2016/TJOI2016]字符串 给出一个长度为$n$的字符串$s$,和$m$个问题。 每个问题均有$a,b,c,d$四个参数,问你子串$s[a,b]$的所有子串和$s[c,d]$的最长公共前缀的长度的最大值是多少? 做法: 二分一个答案$mid$。 现在我们要判断$s[c,c+mid-
阅读全文