首页 > TAG信息列表 > APIO2014
「APIO2014」回文串
\(\text{Solution}\) 这是一道回文树模板题。 回文树 回文树是利用回文串的包含关系建的一个图。 首先回文树有奇根,偶根,偶根的\(fail\)指针指向奇根。 设\(fail_i\)表示标号为\(i\)的回文串失配后,他的最长后缀回文串的标号。 利用\(fail\)可以构造出回文树,考虑一个一个字符加入回luogu P3649 [APIO2014]回文串
题面传送门 结合manacher的拓展过程以及复杂度证明可以知道,一个序列的本质不同回文串是\(O(n)\)个,并且每次拓展时会出现一个可能本质不同的字符串。 那么就把这个回文串扔到SAM上查出现次数就好了。时间复杂度\(O(n\log n)\) 如果这样那也就不会有这篇题解了。 但是问题在于空间开【Luogu P3649】[APIO2014]回文串
链接: 洛谷 题目大意: 给你一个由小写拉丁字母组成的字符串 \(s\)。我们定义 \(s\) 的一个子串的存在值为这个子串在 \(s\) 中出现的次数乘以这个子串的长度。 对于给你的这个字符串 \(s\),求所有回文子串中的最大存在值。 正文: 建一棵回文树,每一次插入字符,将当前最长回文后缀加一,统【洛谷P3647】[APIO2014]连珠线
传送门 前言 对于换根的理解应该和其他题解不一样,求过。 题解 首先分析题目简化题意:给定一棵树,从里面选出若干个“三连点”的边,使边权和最大。其中“三连边”有如下图两种形态:\(3-1-2\) 和 \(3-5-6\) (图源:tommymio) 一开始我想到一种 DP:\(dp(u,0/1/2)\) 表示 \(u\) 节点的子树内可题解 P3648 [APIO2014]序列分割
根据题意可以得到以下的方程。 \(f_{i, j}\) 表示前 \(j\) 个分成 \(i\) 段的答案。 \[f_{i, j} = \max \{f_{i-1, k} + (sum_j - sum_k) \times sum_k\} \]看到这个典型的 2D/1D, 肯定有很多人要开始大力斜率优化了。 但是这里斜率优化又要推一堆式子,又要担心浮点数误差啥的,式子BZOJ3675: [Apio2014]序列分割(斜率优化)
Time Limit: 40 Sec Memory Limit: 128 MB Submit: 4186 Solved: 1629[Submit][Status][Discuss] Description 小H最近迷上了一个分隔序列的游戏。在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列。为了得到k+1个子序列,小H需要重复k次以下的步P3649-[APIO2014]回文串【PAM】
正题 题目链接:https://www.luogu.com.cn/problem/P3649 题目大意 一个字符串,求最大的回文串长度×出现次数 解题思路 构建出\(\text{PAM}\)然后统计一下每个节点作为后缀的次数,\(fail\)树上上传一下信息就好了,时间复杂度\(O(n)\)。 当然也可以\(\text{SAM}+\text{Manacher}+\)P3649-[APIO2014]回文串【PAM】
正题 题目链接:https://www.luogu.com.cn/problem/P3649 题目大意 一个字符串,求最大的回文串长度×出现次数 解题思路 构建出 PAM \text{PAM} PAM然后统计一下每个节点作为后缀的次数,[APIO2014]连珠线 题解
我们设初始的那个点为root。则所有的蓝色链都是形如\(father-now-son\)。 我们设计两个dp状态: \(dp_{i,0}\)表示i号点不作为蓝色链的中间点,\(dp_{i,1}\)表示作为中间点。则以下的转移就非常容易了。 \(dp_{i,0}=\sum \max(dp_{u,1}+w,dp_{u,0})\) \(dp_{i,1}=\sum \max (dp_{u,1}+【UOJ105】[APIO2014] Beads and wires(换根DP)
点此看题面 有两种不同的方式来生成一棵树: 将一个新点与一个旧点用红线连接。 把一条红线断开,将一个新点与这两个端点用蓝线连接。 规定一棵树的权值为蓝线权值总和。 给出最后生成的树(不给出颜色),求可能的最大权值。 \(n\le2\times10^5\) 推性质 蓝线必然两两成对,不妨把一对P3649 [APIO2014]回文串(回文自动机)
题目链接 题意:给你一个由小写拉丁字母组成的字符串 s。 我们定义s的一个子串的存在值为这个子串在s中出现的次数乘以这个子串的长度。 对于给你的这个字符串s,求所有回文子串中的最大存在值。 思路:建出回文树,使用类似后缀自动机统计出现次数的方法。 由于回文树的构造过程中,节点本[斜率优化DP] [APIO2014] 序列分割
题目描述 你正在玩一个关于长度为 \(n\) 的非负整数序列的游戏。这个游戏中你需要把序列分成 \(k + 1\) 个非空的块。为了得到 \(k + 1\) 块,你需要重复下面的操作 \(k\) 次: 选择一个有超过一个元素的块(初始时你只有一块,即整个序列) 选择两个相邻元素把这个块从中间分开,得到两个非空[APIO2014]回文串
题目 题目描述 给你一个由小写拉丁字母组成的字符串 ss。我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这个子串的长度。 对于给你的这个字符串 ss,求所有回文子串中的最大存在值。 输入格式 一行,一个由小写拉丁字母(a~z)组成的非空字符串 ss。 输出格式 输P3649 [APIO2014]回文串
题意:题目描述 给你一个由小写拉丁字母组成的字符串 sss。我们定义 sss 的一个子串的存在值为这个子串在 sss 中出现的次数乘以这个子串的长度。 对于给你的这个字符串 sss,求所有回文子串中的最大存在值。 题解:乍一看这题目又是出现次数又是子串长度还是回文子串,那不就是我P3649 [APIO2014]回文串
P3649 [APIO2014]回文串 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 300010; 5 char s[maxn]; 6 int n; 7 struct PAM { 8 int last; 9 struct Node {10 int cnt, len, fail, son[27]; // cnt为以i为[BZOJ3675] [Apio2014]序列分割
[BZOJ3675] [Apio2014]序列分割 题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3675 https://www.luogu.org/problemnew/show/P3648 Solution 考虑乘法分配律,显然从右到左合并和任意顺序合并本质相同,那么容易得到一个普及组的\(\rm dp\): \[ f[i][j]=\max_{k=1}^{i-1UOJ#103. 【APIO2014】Palindromes PAM模板题
原文链接www.cnblogs.com/zhouzhendong/p/UOJ103.html 前言 我终于会PAM啦 感谢CLY大佬手把手教我PAM 题解 建个 PAM。 统计一下每一个节点的 Right 集合大小,设 size[x] 为节点 x 的 right 集合大小。 求出 max(len[x] * size[x]) ,做完了。 代码 #include <b【SAM manacher】bzoj3676: [Apio2014]回文串
做法一:PAM;做法二:SAM+manacher. Description 考虑一个只包含小写拉丁字母的字符串s。我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度。请你求出s的所有回文子串中的最 大出现值。 Input 输入只有一行,为一个只包含小写字母(a -z)的非空字符串s。 OutpuBZOJ 3676: [Apio2014]回文串 回文自动机
Code: #include <cstdio> #include <cstring> #include <algorithm> #define ll long long #define N 300005 #define maxn 300005 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int str[maxn],n; char s[m[APIO2014]回文串
暂时有两种解法: 1.SA+manacher 考虑到本质不同回文串最多O(n)个 每找到一个,就看它出现多少次,SA数组往两边二分即可 简单粗暴 2.SAM+manacher 就是用SAM来找S[l,r]出现次数 倍增到所在right集合即可。 (回文树,回文自动机,不会告辞)