tiansuohaoer 在 Leetcode每日一题 —— 3841. 查询树上回文路径 中发帖

思路
一个字符串能够重排成回文,当且仅当其中最多只有一种字符出现奇数次。本题只有 26 种字符,因此可以字符压位后查询异或和。 
对于树上路径 (x,y) 的点权异或和 f(x,y),其相当于 f(0,x) \oplus f(0,y) \oplus s[LCA(x,y)]。 
前两部分相当于树上前缀和,即修改时异或上整棵子树,查询时单点查询。因为子树的 DFS 序是连续的,我们可以将树转化成 DFS 序进行区间操作。 
具体地,我们记录每个结点 x 的 DFS 序 l_x 以及对应子树的 DFS 序区间 [l_x,r_x],修改时对 l_x,r_x+1 两个位置各异或一次,查询时求位置 q 的前缀和 p_q,两者都可以用树状数组完成。 
接下来是求 LCA。求 LCA 有很多方式,这里讲一下重链剖分做法: 

求出每个结点大小最大的儿子,即重儿子;
遍历时优先遍历重儿子,将每个点连上...
 
 
Back to Top