当前位置: 首页 > news >正文

DeepSeek LeetCode 3841. 查询树上回文路径 Rust实现

解题思路

核心在于快速判断树中任意两点路径上的字符能否重排为回文串。

· 回文判定:一个字符串能重排成回文,当且仅当其出现奇数次的字符最多只有一个。
用 26 位整数(掩码)表示每个字符的奇偶性:第 i 位为 1 表示字符 i 出现奇数次。
· 前缀异或(XOR)
定义 pref[x] 为从根节点到 x 的路径上所有字符的奇偶掩码。
则 u 到 v 路径的掩码为:
mask(u→v) = pref[u] ^ pref[v] ^ (1 << char(LCA(u,v)))。
· 动态更新
修改节点 u 的字符时,会影响以 u 为根的整棵子树中所有节点的 pref 值。
利用 DFS 序(欧拉序) 将子树映射为连续区间 [tin[u], tout[u]],再用 树状数组(Fenwick Tree) 维护区间异或更新和单点查询。
· LCA 查询:使用二进制提升(Binary Lifting)预处理,O(log n) 回答。

---

Rust 实现

```rust
struct BIT {
bit: Vec<u32>,
n: usize,
}

impl BIT {
fn new(n: usize) -> Self {
BIT {
bit: vec![0; n + 2],
n,
}
}

fn add(&mut self, mut idx: usize, val: u32) {
while idx <= self.n {
self.bit[idx] ^= val;
idx += idx & idx.wrapping_neg(); // lowbit
}
}

// 区间 [l, r] 异或 val
fn range_xor(&mut self, l: usize, r: usize, val: u32) {
self.add(l, val);
self.add(r + 1, val);
}

// 单点查询
fn query(&self, mut idx: usize) -> u32 {
let mut res = 0;
while idx > 0 {
res ^= self.bit[idx];
idx -= idx & idx.wrapping_neg();
}
res
}
}

impl Solution {
pub fn palindrome_path(n: i32, edges: Vec<Vec<i32>>, s: String, queries: Vec<String>) -> Vec<bool> {
let n = n as usize;
// 建图
let mut g = vec![Vec::new(); n];
for e in edges {
let u = e[0] as usize;
let v = e[1] as usize;
g[u].push(v);
g[v].push(u);
}

let s_bytes = s.as_bytes();
let mut depth = vec![0; n];
let mut tin = vec![0; n];
let mut tout = vec![0; n];
let mut pref = vec![0u32; n];
let mut parent = vec![vec![0; n]; 1]; // 第一层,后续扩展

// ---------- 迭代 DFS 计算 tin, tout, depth, parent[0], pref ----------
let mut stack = Vec::new();
stack.push((0, -1, 0)); // (节点, 父节点, 状态) 状态0=进入, 1=离开
let mut timer = 0;
while let Some((u, p, state)) = stack.pop() {
if state == 0 {
timer += 1;
tin[u] = timer;
if p == -1 {
depth[u] = 0;
parent[0][u] = 0;
pref[u] = 1u32 << (s_bytes[u] - b'a');
} else {
let p = p as usize;
depth[u] = depth[p] + 1;
parent[0][u] = p;
pref[u] = pref[p] ^ (1u32 << (s_bytes[u] - b'a'));
}
stack.push((u, p, 1)); // 退出标记
for &v in &g[u] {
if p == -1 || v != p as usize {
stack.push((v, u as i32, 0));
}
}
} else {
tout[u] = timer;
}
}

// ---------- 二进制提升表 ----------
let mut LOG = 1;
while (1 << LOG) <= n {
LOG += 1;
}
parent.resize(LOG, vec![0; n]);
for k in 1..LOG {
for i in 0..n {
parent[k][i] = parent[k - 1][parent[k - 1][i]];
}
}

// LCA 闭包
let lca = |mut u: usize, mut v: usize| -> usize {
if depth[u] < depth[v] {
std::mem::swap(&mut u, &mut v);
}
let diff = depth[u] - depth[v];
for k in 0..LOG {
if diff & (1 << k) != 0 {
u = parent[k][u];
}
}
if u == v {
return u;
}
for k in (0..LOG).rev() {
if parent[k][u] != parent[k][v] {
u = parent[k][u];
v = parent[k][v];
}
}
parent[0][u]
};

let mut bit = BIT::new(n);
let mut chars: Vec<u8> = s_bytes.iter().map(|&b| b - b'a').collect();
let mut ans = Vec::new();

for q in queries {
let parts: Vec<&str> = q.split_whitespace().collect();
match parts[0] {
"update" => {
let u = parts[1].parse::<usize>().unwrap();
let c = parts[2].as_bytes()[0] - b'a';
if c != chars[u] {
let diff = (1u32 << chars[u]) ^ (1u32 << c);
bit.range_xor(tin[u], tout[u], diff);
chars[u] = c;
}
}
"query" => {
let u = parts[1].parse::<usize>().unwrap();
let v = parts[2].parse::<usize>().unwrap();
let w = lca(u, v);
let cur_u = pref[u] ^ bit.query(tin[u]);
let cur_v = pref[v] ^ bit.query(tin[v]);
let mask = cur_u ^ cur_v ^ (1u32 << chars[w]);
// 判断 mask 是否只有 0 或 1 个 1
ans.push((mask & (mask - 1)) == 0);
}
_ => {}
}
}
ans
}
}
```

---

复杂度分析

· 预处理:DFS 和二进制提升均 O(n log n)
· 每次查询/更新:O(log n)(LCA + 树状数组操作)
· 空间:O(n log n)(LCA 表)+ O(n)(其他数组)

该实现充分利用了位运算和区间数据结构,能够高效处理动态树上的回文路径查询。

http://www.jsqmd.com/news/1342969/

相关文章:

  • 2026东莞代运营哪家口碑好?京东代运营外包团队推荐——熔炼电商 - mobible
  • Unity引擎中的时间系统:让游戏世界“流动”起来的隐形时钟
  • 2026沈阳系统门窗封阳台厂家实力观察:断桥铝、阳光房与静音保温的工程化解决路径 - 优企名品
  • 郑州芬尼服务商哪家专业:【芬尼】标准施工 - 晚香时候
  • 2026年唐山本田车改灯大灯总成改装哪家商家靠谱|地址电话与到店核对指南|8月7日资料更新 - mobible
  • 国内企业网盘哪家强?我从五个维度做了个深度横评
  • YimMenu开源工具实战指南:5步构建GTA5安全防护系统
  • 2026通州区户外抽象玻璃钢雕塑/玻璃钢节庆雕塑源头厂家哪家好?实用选购指南(更新时间:2026-08-07) - mobible
  • 2026年太原艺考生美术培训学校相关信息说明 - 奔跑123
  • 2026年优选浙江靠谱的功能性纤维生产厂商口碑推荐——跳出同质化竞争,找到真正降本增效的长期伙伴 - 装修教育财税推荐2026
  • 2026东莞淘宝代运营哪家口碑好|店铺代运营外包推荐,熔炼电商系统化运营 - mobible
  • 2026大庆公务员考试机构哪家口碑好?大庆鸿鹄志远公考联系电话 - mobible
  • 2026年广州逆向磨砂吊牌直销厂家哪家强选购指南 - 热点品牌推荐
  • 2026年面向工业供电需求 专业的500kw发电机组优质厂商选哪家 - 热点品牌推荐
  • 2026年找靠谱木材加工服务商 刨花机厂如何选全攻略 - 热点品牌推荐
  • 存储分离架构中的 KV Cache 如何传输
  • 2026沈阳系统门窗厂家实力解析:格来迪、维派斯、睿博的技术路线与适用场景 - 卓企推荐
  • 2026下半年AI流量新战场:晓名AIGEO如何重构搜索竞争力 - 装修教育财税推荐2026
  • 门户网站建设目标:如何构建真正具备商业价值与用户体验的数字化入口平台
  • 2026海淀区小区户外景观小品雕塑/玻璃钢座椅雕塑选购指南:源头厂家怎么选?上门安装厂家实用攻略(更新时间:2026-08-07) - mobible
  • 郑州空气源地暖选购网点哪家专业:【芬尼】现货供应 - 晴光转树
  • 如何选择优质的网站建设招标方案以打造高转化率数字化营销入口并避开隐形陷阱
  • 2026东莞拼多多代运营哪家靠谱?熔炼电商口碑推荐 - mobible
  • 理工科论文全是公式和数据,为什么AI率还是超标?问题出在论述部分。
  • 3分钟极速上手:Word转LaTeX的免费开源神器docx2tex完全指南
  • 2026推荐:上海制冷设备方案定制怎么选——服务商与选型指南 - 装修教育财税推荐2026
  • 炉石传说HsMod插件:5大核心功能彻底改变你的游戏体验
  • 2026 年当下,朝阳优秀的食品包装螺旋输送机 生产厂家竞争格局,换个思路,用“极端场景假设”的角度来生成,关键词后置,不当头炮: - 行业推荐官-2
  • 应付发票三单匹配从人工到全自动:AI Agent驱动的财务数字化转型路径与方案测评
  • 2026 年新消息:安康有实力的KSG12矿用干式变压器(井下矿用)加工厂格局重塑与选型新思路,井下煤矿作业的安全效率,竟由这台看不见的干式变压器悄悄托底? - 实业推荐官