CF700E E. Cool Slogans】的更多相关文章

[CF700E]Cool Slogans 题意:给你一个字符串S,求一个最长的字符串序列$s_1,s_2,...,s_k$,满足$\forall s_i$是S的子串,且$s_i$在$s_{i-1}$里出现了2次. $|S|\le 10^5$ 题解:容易想到pre树的性质.定义一个字符串的tail为它的出现次数>=2的最长的后缀.对于结束节点来说,它的tail就是它的pre.但是对于一般的点,我们需要不断沿着pre向上找,找到第一个在原串出现2次的节点才能得到tail.具体做法是,我们可以记录sp…
[CF700E]Cool Slogans(后缀自动机) 题面 洛谷 CodeForces 题解 构建后缀自动机,求出后缀树 现在有个比较明显的\(dp\) 设\(f[i]\)表示从上而下到达当前点能够满足条件的最优值 只需要检查父亲节点是否在当前串中出现过两次就行了 这个判断用\(endpos\)来判断 如果出现过超过两次,那么在当前点所掌控的任意一个\(endpos\)以及前面的区间中 必定出现了超过两次 用一个线段树合并求\(endpos\)集合 然后计算一下出现次数就好了 #include…
https://codeforces.com/contest/700/problem/E 题解:https://www.luogu.org/problemnew/solution/CF700E 其实就是从父亲到儿子dp,因为parent树上父亲一定是儿子的后缀,那么只要再找一个出现位置就好了,又因为父亲的right集合包含儿子的right集合,所以对于任意一个儿子出现的位置check就好.然后开n颗动态开点线段树按照拓扑序从下网上合并一下搞出每个点的right集合,然check一下f[fa]这颗…
CF700E Cool Slogans 题目描述 给出一个长度为n的字符串\(s[1]\),由小写字母组成.定义一个字符串序列\(s[1....k]\),满足性质:\(s[i]\)在\(s[i-1] (i>=2)\)中出现至少两次(位置可重叠),问最大的\(k\)是多少,使得从\(s[1]\)开始到\(s[k]\)都满足这样一个性质. 很妙的题啊. 首先\(s[i]\)一定是\(s[i+1]\)的后缀.因为如果不是,我们可以吧多余的部分删除,这样不影响答案. 我们建出后缀自动机,然后在\(fai…
传送门 在最优的情况下,序列\(s_1,s_2,...,s_k\)中,\(s_i (i \in [2 , k])\)一定会是\(s_{i-1}\)的一个\(border\),即\(s_i\)同时是\(s_{i-1}\)的前缀和后缀,否则一定可以通过减去\(s_{i-1}\)的一个前缀和后缀使得满足条件. 对原串建立\(SAM\),因为有互为后缀的条件,所以\(s_1,s_2,...,s_k\)会对应\(parent\)树一条链上的若干状态. 发现可以在\(parent\)树上DP.设\(f_i\…
Description 给你一个字符串,如果一个串包含两个可有交集的相同子串,那么这个串的价值就是子串的价值+1.问你给定字符串的最大价值子串的价值. Input 第一行读入字符串长度$n$,第二行是字符串. Output 一行答案. Sample Input1 3abc Sample Output1 1 Sample Input2 5ddddd Sample Output2 5 Sample Input3 11abracadabra Sample Output3 3 Solution 首先把后…
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}\)中至少出现了两次意味…
题目描述 给出一个长度为n的字符串s[1],由小写字母组成.定义一个字符串序列s[1....k],满足性质:s[i]在s[i-1] (i>=2)中出现至少两次(位置可重叠),问最大的k是多少,使得从s[1]开始到s[k]都满足这样一个性质. 发现 $s[1...k]$ 之间一定是互为后缀关系. 那么就可以建出后缀树,令 $dp_{u}$ 表示 $u$ 节点代表子串的答案 维护 $top_{u}$ 表示 $u$ 以及 $u$ 在后缀树的祖先中合法的且答案最大(答案相同则最短)的节点编号 $dp_{…
原文链接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| 则必然存在一个位置…
E. Cool Slogans 链接 题意: 给定一个字符串S,从中选出k个子串a[1],a[2]...a[k],满足a[i]在a[i+1]中出现了两次(可以重叠),求最大的k. 分析: 建出SAM,在parent树上dp,dp[i]表示到第i个点,最多选了多少个子串,那么如果fa[i]在i中出现了两次,就可以+1后转移,否则直接继承fa[i]的值即可. 那么如何判断一个串是否在另一个串中出现了两次? 后缀自动机上每个点表示多个串,如果点A对应的串在点B对应的串中出现了两次,那么设B的结尾节点是…