CF1063F String Journey DP、SAM、线段树】的更多相关文章

题意 在 \(S\) 中找出 \(t\) 个子串满足 \(t_{i+1}\) 是 \(t_{i}\) 的子串,要让 \(t\) 最大. \(|S| \leq 5\times 10^5\). 分析 定义状态 \(f_{i}\) 表示从 \(i\) 出发能够得到的最长的 \(journey\) . 容易得到最终的答案最右边的串长度一定可以是1. 同时如果删掉没用的部分过后 \(t_i\) 的长度一定可以为 $t_{i+1} +1 $. 如果在 \(i\) 位置存在长度为 \(k\) 的答案的话,将两…
传送门 为了方便把串反过来,条件变为\(t_i\)是\(t_{i+1}\)的真子串,答案显然不变. 一件重要的事情是必定存在一种最优解,字符串序列\(\{t\}\)满足\(|t_i| = i\). 考虑DP:设\(f_i\)表示字符串序列\(\{t\}\)的最后一个串的结尾位置为\(i\)时,\(|t|\)的最大值.不难发现如果\(f_i = x\),那么一定存在最后一个串结尾位置为\(i\).长度在\([1,x]\)内的字符串序列. 因为有\(f_i \leq f_{i-1}+1\)(因为对于…
复习SAM板子啦!考前刷水有益身心健康当然这不是板子题/水题…… 很容易发现只在i位置出现的串一定是个前缀串.那么对答案的贡献分成两部分:一部分是len[x]-fa~len[x]的这部分贡献会是r-l+1:剩下一部分1~len-fa-1这部分会和i~r构成答案,写两棵线段树即可. 然后就又是板子题了,两个板子(SAM+线段树)套起来. #include<bits/stdc++.h> #define lson l,mid,rt<<1 #define rson mid+1,r,rt&l…
题目链接 https://codeforces.com/contest/1063/problem/F 题解 虽然本题有时间复杂度较高但非常好写的做法...... 首先,若答案为 \(k\),则一定存在一种最优方案,使得对于任意 \(i \in [1, k)\),有 \(|t_i| = |t_{i + 1}| + 1\),换句话说,第 \(i + 1\) 个字符串可以通过第 \(i\) 个字符串删掉首字符或尾字符得到.其正确性显然. 这样,我们可以记录 \(f_i\) 表示串 \(s\) 从 \(…
正题 题目链接:https://www.luogu.com.cn/problem/CF700E 题目大意 给出一个字符串\(S\),求一个最大的\(k\)使得存在\(k\)个字符串其中\(s_1\)是\(S\)的子串,\(s_{i+1}\)在\(s_i\)中出现了至少\(2\)次. 解题思路 首先我们需要有两个结论 \(s_{i+1}\)一定是\(s_i\)的其中一个后缀.因为如果\(s_{i+1}\)不是\(s_i\)的一个后缀,那么\(s_i\)去掉后面那一部分不会影响匹配数并且更短,也就是…
RemoteJudge 又是一道用线段树合并来维护\(endpos\)的题,还有一道见我的博客CF666E 思路 先把\(SAM\)建出来 如果两个相邻的串\(s_i\)和\(s_{i+1}\)要满足\(s_i\)在\(s_{i+1}\)中至少出现了两次,那么\(s_i\)显然是\(s_{i+1}\)对应的结点在\(parent\ tree\)上的祖先,那么我们可以在\(parent\ tree\)上树形dp来得出答案 转移自顶向下进行,\(s_i\)在\(s_{i+1}\)中至少出现了两次意味…
原文链接https://www.cnblogs.com/zhouzhendong/p/CF700E.html 题解 首先建个SAM. 一个结论:对于parent树上任意一个点x,以及它所代表的子树内任意一个点y,设节点y代表的最长串为S,设节点x代表的串为T1,T2,T3,...,设 F(S,T) 表示串T在S中的出现次数,则 F(S,T1) = F(S,T2) = F(S,T3) = ... 证明:假设串 Ta 和 Tb 在 S 中的出现次数不同,且 |Ta|+1=|Tb| 则必然存在一个位置…
Description 给你一个字符串,如果一个串包含两个可有交集的相同子串,那么这个串的价值就是子串的价值+1.问你给定字符串的最大价值子串的价值. Input 第一行读入字符串长度$n$,第二行是字符串. Output 一行答案. Sample Input1 3abc Sample Output1 1 Sample Input2 5ddddd Sample Output2 5 Sample Input3 11abracadabra Sample Output3 3 Solution 首先把后…
又是一道\(SAM\)维护\(endpos\)集合的题,我直接把CF700E的板子粘过来了QwQ 思路 如果我们有\([l,r]\)对应的\(SAM\),只需要在上面贪心就可以了.因为要求的是字典序比\(T\)大且最小的子串,我们从前到后让尽可能多的位相等,如果再也无法相等了就从后往前找一位变大. 但是每次询问会给我们一个可行区间\([l,r]\),而我们又显然不能直接把对应区间的\(SAM\)建出来,否则复杂度会\(GG\). 仔细想一下,其实我们并不需要知道\([l,r]\)区间对应的\(S…
RemoteJudge 题目大意 给你一个串\(S\)以及一个字符串数组\(T[1...m]\),\(q\)次询问,每次问\(S\)的子串\(S[p_l...p_r]\)在\(T[l...r]\)中的哪个串里的出现次数最多,并输出出现次数. 如有多解输出最靠前的那一个. 思路 第一次见到在\(parent tree\)上线段树合并的题,感觉好妙 先对\(T\)建一个广义后缀自动机,考虑对\(SAM\)上的每一个结点建一颗线段树,值域为\([1,m]\),维护出现次数最多的串的位置和次数.又因为\…