use std::collections::{BTreeSet, HashMap};
fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // '
fn g(mut a: Vec<BTreeSet<usize>>) -> Vec<BTreeSet<usize>> {
for i in 0..a.len() {
for j in 0..a.len() {
if i != j && !a[i].is_disjoint(&a[j]) {
let js = a[j].clone();
a[i].extend(js);
return g(a);
}
}
}
a
}
let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, a.len() * 2 - p)).collect::<HashMap<_, _>>();
let a = a.iter().map(|&s| s.split('=').map(|k| *h.get(k).unwrap()).collect::<BTreeSet<_>>()).collect();
let hi = h.iter().map(|(&k, &v)| (v, k)).collect::<HashMap<_, _>>();
g(a).iter().map(|set| set.iter().map(|i| *hi.get(i).unwrap()).collect()).collect()
}
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));
}
dXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZVNldCwgSGFzaE1hcH07CmZuIGY8J2E+KGE6ICZbJidhIHN0cl0pIC0+IFZlYzxWZWM8JidhIHN0cj4+IHsgLy8gJwoJZm4gZyhtdXQgYTogVmVjPEJUcmVlU2V0PHVzaXplPj4pIC0+IFZlYzxCVHJlZVNldDx1c2l6ZT4+IHsKCQlmb3IgaSBpbiAwLi5hLmxlbigpIHsKCQkJZm9yIGogaW4gMC4uYS5sZW4oKSB7CgkJCQlpZiBpICE9IGogJiYgIWFbaV0uaXNfZGlzam9pbnQoJmFbal0pIHsKCQkJCQlsZXQganMgPSBhW2pdLmNsb25lKCk7CgkJCQkJYVtpXS5leHRlbmQoanMpOwoJCQkJCWEucmVtb3ZlKGopOwoJCQkJCXJldHVybiBnKGEpOwoJCQkJfQoJCQl9CgkJfQoJCWEKCX0KICAgIGxldCBoID0gYS5pdGVyKCkubWFwKHwmc3wgcy5zcGxpdCgnPScpKS5mbGF0dGVuKCkucmV2KCkuZW51bWVyYXRlKCkubWFwKHwocCwgcyl8IChzLCBhLmxlbigpICogMiAtIHApKS5jb2xsZWN0Ojo8SGFzaE1hcDxfLCBfPj4oKTsKCWxldCBhID0gYS5pdGVyKCkubWFwKHwmc3wgcy5zcGxpdCgnPScpLm1hcCh8a3wgKmguZ2V0KGspLnVud3JhcCgpKS5jb2xsZWN0Ojo8QlRyZWVTZXQ8Xz4+KCkpLmNvbGxlY3QoKTsKCWxldCBoaSA9IGguaXRlcigpLm1hcCh8KCZrLCAmdil8ICh2LCBrKSkuY29sbGVjdDo6PEhhc2hNYXA8XywgXz4+KCk7CglnKGEpLml0ZXIoKS5tYXAofHNldHwgc2V0Lml0ZXIoKS5tYXAofGl8ICpoaS5nZXQoaSkudW53cmFwKCkpLmNvbGxlY3QoKSkuY29sbGVjdCgpCn0KZm4gbWFpbigpIHsKICAgIGxldCB2ID0gWyJhMT1hMiIsICJiMT1iMiIsICJiMz1iMiIsICJjMT1jMiIsICJlMT1lMiIsCiAgICAgICAgICAgICAiYTM9YTQiLCAiYzM9YzQiLCAiZTE9ZTMiLCAiYTI9YTQiLCAiYzM9YzEiLAogICAgICAgICAgICAgImIzPWE0IiwgImMyPWQxIiwgImE0PWE1IiwgImQyPWMxIiwgImI0PWIzIiwgImQzPWMzIl07CiAgICBwcmludGxuISgiezo/fSIsIGYoJnYpKTsKfQ==
[["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"], ["c1", "c2", "c3", "c4", "d1", "d2", "d3"], ["e1", "e2", "e3"]]