function c = unique_stable(a)
[c, ~, ic] = unique(a);
ia = arrayfun(@(n) find(ic == n)(1), 1:numel(c));
c = a(sort(ia));
end
function b = unionize_if_intersect(b)
if size(b, 1) < 2, return, end
for ij = nchoosek(1:size(b, 1), 2)'
if any(b(ij(1), :) & b(ij(2), :))
b(ij(1), :) = b(ij(1), :) | b(ij(2), :);
b(ij(2), :) = [];
b = unionize_if_intersect(b);
break
end
end
end
function c = f(a)
u = unique_stable(cell2mat(cellfun(@(s) {strsplit(s, "=")}, a)));
s2b = @(s) any(cell2mat(cellfun(@(k) {strcmp(u, k)}, strsplit(s, "=")')));
b = unionize_if_intersect(cell2mat(cellfun(@(s) {s2b(s)}, a')));
c = arrayfun(@(r) {u(b(r, :))}, 1:size(b, 1)');
end
a = {"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"};
disp(['[' strjoin(cellfun(@(s) {['["' strjoin(s, '", "') '"]']}, f(a)), ', ') ']'])
ZnVuY3Rpb24gYyA9IHVuaXF1ZV9zdGFibGUoYSkKCVtjLCB+LCBpY10gPSB1bmlxdWUoYSk7CglpYSA9IGFycmF5ZnVuKEAobikgZmluZChpYyA9PSBuKSgxKSwgMTpudW1lbChjKSk7CgljID0gYShzb3J0KGlhKSk7CmVuZApmdW5jdGlvbiBiID0gdW5pb25pemVfaWZfaW50ZXJzZWN0KGIpCglpZiBzaXplKGIsIDEpIDwgMiwgcmV0dXJuLCBlbmQKCWZvciBpaiA9IG5jaG9vc2VrKDE6c2l6ZShiLCAxKSwgMiknCgkJaWYgYW55KGIoaWooMSksIDopICYgYihpaigyKSwgOikpCgkJCWIoaWooMSksIDopID0gYihpaigxKSwgOikgfCBiKGlqKDIpLCA6KTsKCQkJYihpaigyKSwgOikgPSBbXTsKCQkJYiA9IHVuaW9uaXplX2lmX2ludGVyc2VjdChiKTsKCQkJYnJlYWsKCQllbmQKCWVuZAplbmQKZnVuY3Rpb24gYyA9IGYoYSkKCXUgPSB1bmlxdWVfc3RhYmxlKGNlbGwybWF0KGNlbGxmdW4oQChzKSB7c3Ryc3BsaXQocywgIj0iKX0sIGEpKSk7CglzMmIgPSBAKHMpIGFueShjZWxsMm1hdChjZWxsZnVuKEAoaykge3N0cmNtcCh1LCBrKX0sIHN0cnNwbGl0KHMsICI9IiknKSkpOwoJYiA9IHVuaW9uaXplX2lmX2ludGVyc2VjdChjZWxsMm1hdChjZWxsZnVuKEAocykge3MyYihzKX0sIGEnKSkpOwoJYyA9IGFycmF5ZnVuKEAocikge3UoYihyLCA6KSl9LCAxOnNpemUoYiwgMSknKTsKZW5kCmEgPSB7ImExPWEyIiwgImIxPWIyIiwgImIzPWIyIiwgImMxPWMyIiwgImUxPWUyIiwgLi4uCiAgICAgImEzPWE0IiwgImMzPWM0IiwgImUxPWUzIiwgImEyPWE0IiwgImMzPWMxIiwgLi4uCiAgICAgImIzPWE0IiwgImMyPWQxIiwgImE0PWE1IiwgImQyPWMxIiwgImI0PWIzIiwgImQzPWMzIn07CmRpc3AoWydbJyBzdHJqb2luKGNlbGxmdW4oQChzKSB7WydbIicgc3Ryam9pbihzLCAnIiwgIicpICciXSddfSwgZihhKSksICcsICcpICddJ10p