BZOJ5304 : [Haoi2018]字串覆盖】的更多相关文章

离线处理所有询问. 对于$r-l\leq 50$的情况: 按照串长从$1$到$51$分别把所有子串按照第一位字符为第一关键字,上一次排序结果为第二关键字进行$O(n)$基数排序. 同理也可以用上一次比较结果来判断这一次某两个子串是否相同. 对于每个询问,找到排序结果中对应的区间,在里面二分出起点$x$,问题转化为从$x$开始贪心会一直往右跳最终能跳过多少个位置. 继续离线,预处理出每个$x$的后继$f_x$作为$x$的祖先,DFS这棵树的时候在栈上二分即可. 时间复杂度$O(len\times…
[BZOJ5304][HAOI2018]字串覆盖(后缀数组,主席树,倍增) 题面 BZOJ 洛谷 题解 贪心的想法是从左往右,能选就选.这个显然是正确的. 题目的数据范围很好的说明了要对于询问分开进行处理. 先考虑询问的模板串长比较大的情况. 那么只需要每次找到一个范围内的最小位置然后接着暴力跳就可以了. 这个这个过程可以把\(AB\)两个串拼接在一起求\(SA\),这样能够匹配上\(P\)串的\(A\)的后缀的起始位置在\(SA\)上就是一段连续区间.考虑每次找出在\(A\)的\([l,r]\…
题面 传送门 题解 字符串就硬是要和数据结构结合在一起么--\(loj\)上\(rk1\)好像码了\(10k\)的样子-- 我们设\(L=r-l+1\) 首先可以发现对于\(T\)串一定是从左到右,能取就取是最优的 我们先用后缀自动机\(+\)线段树合并求出自动机上每一个节点的\(endpos\)集合.如果\(L\)较大的时候,我们考虑二分找到第一个端点,再找下一个--这样在线段树上找的总次数是\({n\over L}\),复杂度为\(O({n\over L}\log n)\) 但是\(L\)较…
「HAOI2018」字串覆盖 题意: ​ 给你两个字符串,长度都为\(N\),以及一个参数\(K\),有\(M\)个询问,每次给你一个\(B\)串的一个子串,问用这个字串去覆盖\(A\)串一段区间的最大收益是多少?(\(N,M\le100000,K\leq10^9\))其中,子串长度在\(51\)到\(2000\)的询问个数不会超过\(11000\)个. 题解: ​ 题目的暗示很明显,分类做. ​ 建出\(sam\),维护\(right\)集. ​ 对于询问大于\(50\)的直接暴力跳. ​ 对…
题解 写后缀树真是一写就好久,然后调好久QAQ 我们把两个串取反拼一起建后缀树,这样的话使得后缀树是正串的后缀树 然后我们把询问挂在每个节点上,每次线段树合并,对于大于50的每次暴力跳着在线段树找,对于小于50的建出一棵树来,也就是\(a[i][j]\)表示第\(i\)位往后\(j\)位,向下一个\(a[t][j]\)有\(t >= j\)连一条边 这是一棵树,在树上倍增就行了 说起算法来很容易吧!!!!写起来特别烦QAQ 代码 #include <bits/stdc++.h> #def…
给定两个串,均由最小字母组成.求这两个串的最大公共字串LCS(Longest Common Substring). 使用动态规划解决. #include <iostream> #include <vector> #include <cstring> #include <algorithm> using namespace std; #define MAX 100 int LCS(string left, string right){ int imax = -…
Answer: import java.util.Scanner; public class Palindrome { private static int len;//全局变量整型数据 private static char p[];//全局变量数组 public static void main(String args[]) {Scanner sc=new Scanner(System.in); String str; str=sc.nextLine(); len=str.length();…
题目描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2$ 可以变换为 B2$ …. 例如:A$='abcd'B$='xyz' 变换规则为: ‘abc’->‘xu’‘ud’->‘y’‘y’->‘yz’ 则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为: ‘abcd’->‘xud’->‘xy’->‘xyz’ 共进行了三…
split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如下: var mystr = "www.imooc.com"; document.write(mystr.split(".")+"<br>"); document.write(mystr.split(".", 2)+&…
mormot 数据集转换为JSON字串 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, ADODB ,SynCommons, SynDB ; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; ADOConnection1: TAD…