题目描述 给一个小写字母字符串 S ,q 次询问每次给出 l,r ,求 s[l..r] 的 Border . Border: 对于给定的串 s ,最大的 i 使得 s[1..i] = s[|s|-i+1..|s|], |s| 为 s 的长度. 题解 这题的描述很短,给人一种很可做的假象. 暴力1:每次对区间lr做一次KMP,求出border数组,复杂度nq. 暴力2:构建后缀自动机,用线段树合并维护出right集合考虑到两个串的最长后缀为他们在parent树上的LCA的len,所以我们可以在pa…
这题我写了一天后交了一发就过了我好兴奋啊啊啊啊啊啊 题目 洛谷 4482 分析 这题明明可以在线做的,为什么我见到的所有题解都是离线啊 -- 什么时候有机会出一个在线版本坑人. 题目的要求可以转化为求出一个最大的 \(i(i<r)\) 满足 \(i-\mathrm{lcs}(i,r)<l\) ,其中 \(\mathrm{lcs}(i,r)\) 表示 前缀 \(i\) 和 前缀 \(r\) 的最长公共后缀.答案就是 \(i-l+1\) . 在 SAM 上考虑这个问题.fa 树.max.\(R_u…
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nlogn\),均摊下来就是\(logn\). 判断联通性的问题就用并查集来解决. 如果在同一个联通块里,就不能合并,否则会出一点问题. 代码 #include <bits/stdc++.h> using namespace std; const int N = 3000000 + 6; int rt…
传送门 洛谷 Solution 做过的比较玄学的后缀自动机. 果然就像\(Tham\)所讲,后缀自动机这种东西考场考了不可能做的出来的... 考虑如果\(l=1,r=|S|\)的怎么做? 直接建后缀自动机然后跳. 接着就是\(l,r\)随机... 详细说明可点开蓝色题解按钮然后膜拜第一篇题解! 考虑线段树合并,我们关心的其实只有父亲关系和len对吧. 那么维护一下区域有多少个值,然后每一次查询符不符合要求就好了. 代码实现 代码戳这里…
传送门 思路 按照套路,直接上后缀自动机. 部分分:\(l=1,r=|S|\) 首先把\(S\)和\(T\)的后缀自动机都建出来. 考虑枚举\(T\)中的右端点\(r\),查询以\(r\)结尾的串最长可以往左延伸多长,使得它仍然是\(S\)的子串.记该长度为\(lim_r\). \(lim_r\)可以在\(SAM_S\)中瞎跳跳出来. 那么答案即为 \[ \sum_{i=2}^{cnt} \max(0,len_i-\max(len_{fa_i},lim_{pos_i})) \] 其中\(i\)是…
题目传送门 传送门 题目大意 区间border. 照着金策讲稿做. Code /** * luogu * Problem#P4482 * Accepted * Time: 8264ms * Memory: 37924k */ #include <bits/stdc++.h> using namespace std; typedef bool boolean; template <typename T> void pfill(T* pst, const T* ped, T val)…
「BJWC2018」Border 的四种求法 题目描述 给一个小写字母字符串 \(S\) ,\(q\) 次询问每次给出 \(l,r\) ,求 \(s[l..r]\) 的 Border . \(1 \leq n,q \leq 10^5\) 解题思路 : 求 Border 等价于在 \([l, r)\) 中找一个点 \(i\) ,满足 \(lcs(i, r) \geq i -l + 1\) ,且 \(i\) 最大. 考虑把问题丢到 \(\text{Sam}\) 上,那么满足的条件变为 \(len(l…
description luogu 给一个小写字母字符串\(S\),\(q\)次询问每次给出\(l,r\),求\(s[l..r]\)的\(Border\). solution 我们考虑转化题面:给定\(l,r\),求满足\(lcs(i,r)\ge i-l+1\)的最大的\(i\). 对于\(lcs(i,r)\),考虑对\(S\)构建\(SAM\),那么我们知道\(lcs\)的可能取值就是从后缀\(r\)所代表的节点沿着\(fail\)树到根节点的路径上节点的\(len\)的取值. 那么我们得到了…
题目: 洛谷4770 UOJ395 分析: 一个很好的SAM应用题-- 一句话题意:给定一个字符串\(S\).每次询问给定字符串\(T\)和两个整数\(l\).\(r\),求\(T\)有多少个本质不同的非空子串不是\(S[l,r]\)的子串. 首先显然是"正难则反",求有多少个本质不同的非空子串是\(S[l,r]\)的子串(下面的"答案"一词指的是这个值).先考虑没有\(l\)和\(r\)限制的情况.分别处理询问.对于\(S\)建出后缀自动机.枚举\(T\)的所有前…
luogu 对于每个询问从大到小枚举长度,哈希判断是否合法,AC 假的(指数据) 考虑发掘border的限制条件,如果一个border的前缀部分的末尾位置位置\(x(l\le x < r)\)满足\(s[l,x]=s[r-(x-l+1)+1,r]\),那么要满足最长公共后缀\(lcs(x,r)\ge x-l+1\) 而\(lcs(x,y)\)是\(x,y\)两个点在串\(S\)的sam的\(parent\)树上的lca的\(length\),所以先把\(S\)的sam建出来,那么询问\((l,r…