}
}
- let mut max = 0;
+ let mut max = 0; let mut winners = Vec::with_capacity(8);
for node in map.values() {
//stdout.write_all(b";; ponder `")?;
//stdout.write_all(node.word)?;
let mut node: &Node = node;
let mut parent;
let n = node.word.len();
- if n <= 1 { parent = None; }
- else { parent = map.get(&node.word[0 .. n - 1]).map(|n| &**n); }
+ if n <= 1 { continue; }
+ parent = map.get(&node.word[0 .. n - 1]).map(|n| &**n);
+ if let None = parent { continue; }
node.up.set(parent);
let mut nlen = node.len.get();
- while let Some(parent_node) = parent {
- let plen = parent_node.len.get(); nlen += 1;
- if plen > nlen
- { break; }
- else if plen == nlen {
- node.right.set(parent_node.down.get());
- parent_node.down.set(Some(node));
- break;
- } else {
- parent_node.down.set(Some(node));
- node.right.set(None);
- parent_node.len.set(nlen);
- node = parent_node; parent = node.up.get();
+ loop {
+ match parent {
+ None => {
+ if nlen >= max {
+ if nlen > max {
+ max = nlen;
+ winners.clear();
+ }
+ winners.push(node);
+ }
+ break;
+ }
+ Some(parent_node) => {
+ let plen = parent_node.len.get(); nlen += 1;
+ if plen > nlen
+ { break; }
+ else if plen == nlen {
+ node.right.set(parent_node.down.get());
+ parent_node.down.set(Some(node));
+ break;
+ } else {
+ parent_node.down.set(Some(node));
+ node.right.set(None);
+ parent_node.len.set(nlen);
+ node = parent_node; parent = node.up.get();
+ }
+ }
}
}
- if nlen > max { max = nlen; }
}
- for node in map.values() {
- if node.len.get() == max
- { print_chain(node, &mut stdout)?; stdout.write(b"\n")?; }
- }
+ for node in winners
+ { print_chain(node, &mut stdout)?; stdout.write(b"\n")?; }
Ok(())
}