use std::collections::HashMap;
fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // '
let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, p)).collect::<HashMap<_, _>>();
let mut acc = Vec::<Vec<&str>>::new();
for xy in a.iter().map(|s| s.split('=').collect::<Vec<_>>()) {
match (acc.iter().position(|b| b.contains(&xy[0])), acc.iter().position(|b| b.contains(&xy[1]))) {
(Some(xi), Some(yi)) => {
let ys = acc[yi].clone();
acc[xi].extend(ys);
},
(Some(xi), None) => acc[xi].push(xy[1]),
(None, Some(yi)) => acc[yi].push(xy[0]),
_ => acc.push(xy),
}
}
acc.iter_mut().for_each(|b| b.sort_by(|c, d| h.get(d).cmp(&h.get(c))));
acc.sort_by(|c, d| h.get(d[0]).cmp(&h.get(c[0])));
acc
}
fn main() {
let v = ["a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2",
"a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1",
"b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"];
println!("{:?}", f(&v));
}
dXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7CmZuIGY8J2E+KGE6ICZbJidhIHN0cl0pIC0+IFZlYzxWZWM8JidhIHN0cj4+IHsgLy8gJwogICAgbGV0IGggPSBhLml0ZXIoKS5tYXAofCZzfCBzLnNwbGl0KCc9JykpLmZsYXR0ZW4oKS5yZXYoKS5lbnVtZXJhdGUoKS5tYXAofChwLCBzKXwgKHMsIHApKS5jb2xsZWN0Ojo8SGFzaE1hcDxfLCBfPj4oKTsKICAgIGxldCBtdXQgYWNjID0gVmVjOjo8VmVjPCZzdHI+Pjo6bmV3KCk7CiAgICBmb3IgeHkgaW4gYS5pdGVyKCkubWFwKHxzfCBzLnNwbGl0KCc9JykuY29sbGVjdDo6PFZlYzxfPj4oKSkgewogICAgCW1hdGNoIChhY2MuaXRlcigpLnBvc2l0aW9uKHxifCBiLmNvbnRhaW5zKCZ4eVswXSkpLCBhY2MuaXRlcigpLnBvc2l0aW9uKHxifCBiLmNvbnRhaW5zKCZ4eVsxXSkpKSB7CiAgICAJCShTb21lKHhpKSwgU29tZSh5aSkpID0+IHsKICAgIAkJCWxldCB5cyA9IGFjY1t5aV0uY2xvbmUoKTsKICAgIAkJCWFjY1t4aV0uZXh0ZW5kKHlzKTsKICAgIAkJCWFjYy5yZW1vdmUoeWkpOwogICAgCQl9LAogICAgCQkoU29tZSh4aSksIE5vbmUpID0+IGFjY1t4aV0ucHVzaCh4eVsxXSksCiAgICAJCShOb25lLCBTb21lKHlpKSkgPT4gYWNjW3lpXS5wdXNoKHh5WzBdKSwKICAgIAkJXyA9PiBhY2MucHVzaCh4eSksCiAgICAJfQogICAgfQogICAgYWNjLml0ZXJfbXV0KCkuZm9yX2VhY2gofGJ8IGIuc29ydF9ieSh8YywgZHwgaC5nZXQoZCkuY21wKCZoLmdldChjKSkpKTsKICAgIGFjYy5zb3J0X2J5KHxjLCBkfCBoLmdldChkWzBdKS5jbXAoJmguZ2V0KGNbMF0pKSk7CiAgICBhY2MKfQpmbiBtYWluKCkgewogICAgbGV0IHYgPSBbImExPWEyIiwgImIxPWIyIiwgImIzPWIyIiwgImMxPWMyIiwgImUxPWUyIiwKICAgICAgICAgICAgICJhMz1hNCIsICJjMz1jNCIsICJlMT1lMyIsICJhMj1hNCIsICJjMz1jMSIsCiAgICAgICAgICAgICAiYjM9YTQiLCAiYzI9ZDEiLCAiYTQ9YTUiLCAiZDI9YzEiLCAiYjQ9YjMiLCAiZDM9YzMiXTsKICAgIHByaW50bG4hKCJ7Oj99IiwgZigmdikpOwp9
[["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"], ["c1", "c2", "c3", "c4", "d1", "d2", "d3"], ["e1", "e2", "e3"]]