OI
唉,还是没有考虑清楚细节。
容易发现,一个双倍回文串必定是一个回文串,同时前半段也是一个回文串。那么在使用Manacher算法求取每个字符对应的最长回文串时,就可以同步更新答案。
但一开始我写出这样的判断:
- 1
- 2
- 3
// 完成第i个字符的最长回文的更新后 if (len[i] % 4 == 0 && len[i - (len[i] >> 1)] == len[i] / 2) ans = max (ans, len[i]);
想看正解请直接跳过文章前半段。
不知道到底错没错的错解
这是一道树的直径的必经边问题。
单单求树的直径是非常简单的。可以通过两次DFS/BFS或一次树形DP完成的求解。显然,树的直径长度唯一,但构成该长度的链的方案可能不唯一。
我仍然坚持认为这道题不应该放在LCA的专题里面
一拿到题我毫无头绪……这看起来跟最近公共祖先没有半毛钱关系啊?我的第一反应是“递推出从某个状态开始能达到的所有状态”,时间复杂度大约是(至于为什么底数为,请看完下一节后思考)。但很明显,坐标在范围内的数据可容不下这般折腾。
但鉴于它被放在这个专题中,我们就尝试从树的角度来考虑。