class Graph():
def __init__(self):
self.graph = {};
self.all_path_list = [];
def add_node(self, node, child):
if ( node not in self.graph ):
self.graph[node] = [];
if ( child not in self.graph ):
self.graph[child] = [];
self.graph[node].append(child);
def echo(self, init_node, end_node):
self.find_all_path(init_node, end_node, '');
return ','.join(self.all_path_list);
def find_all_path(self, cur_node, end_node, path):
path += cur_node;
if ( cur_node == end_node ):
self.all_path_list.append(path);
return;
if ( not self.graph[cur_node] ):
return;
for node in self.graph[cur_node]:
self.find_all_path(node, end_node, path);
graph = Graph();
stash = '1{2,3}4{5,6}7';
sep = ['{', ',', '}'];
init_node = end_node = None;
parents = {};
def deploy(i = 0, node = None, deep = 0):
global stash, sep, init_node, end_node, parents;
parent, node = node, '';
back = False;
while ( i < len(stash) ):
ch = stash[i];
if ( ch not in sep ):
node += ch;
i += 1;
continue;
elif ( ch == sep[0] ):
if ( init_node is None ):
init_node = node;
if ( parent is not None ):
graph.add_node(parent, node);
i, parents[deep + 1] = deploy(i + 1, node, deep + 1);
back = True;
node = '';
elif ( ch == sep[1] ):
if ( init_node is None ):
init_node = node;
if back:
for item in parents[deep + 1]:
graph.add_node(item, node);
del parents[deep + 1];
else:
graph.add_node(parent, node);
parents[deep] = [];
parents[deep].append(node);
node = '';
i += 1;
continue;
elif ( ch == sep[2] ):
if back:
for item in parents[deep + 1]:
graph.add_node(item, node);
else:
graph.add_node(parent, node);
parents[deep].append(node);
return i + 1, parents[deep];
end_node = node;
for item in parents[deep + 1]:
graph.add_node(item, node);
deploy();
out_str = graph.echo(init_node, end_node);
print(out_str); # abcdefgxywer,abcdehxywer,abstuvdwer,abstzxdwer
Y2xhc3MgR3JhcGgoKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmdyYXBoID0ge307CiAgICAgICAgc2VsZi5hbGxfcGF0aF9saXN0ID0gW107CgogICAgZGVmIGFkZF9ub2RlKHNlbGYsIG5vZGUsIGNoaWxkKToKICAgICAgICBpZiAoIG5vZGUgbm90IGluIHNlbGYuZ3JhcGggKToKICAgICAgICAgICAgc2VsZi5ncmFwaFtub2RlXSA9IFtdOwogICAgICAgIGlmICggY2hpbGQgbm90IGluIHNlbGYuZ3JhcGggKToKICAgICAgICAgICAgc2VsZi5ncmFwaFtjaGlsZF0gPSBbXTsKCiAgICAgICAgc2VsZi5ncmFwaFtub2RlXS5hcHBlbmQoY2hpbGQpOwoKICAgIGRlZiBlY2hvKHNlbGYsIGluaXRfbm9kZSwgZW5kX25vZGUpOgogICAgICAgIHNlbGYuZmluZF9hbGxfcGF0aChpbml0X25vZGUsIGVuZF9ub2RlLCAnJyk7CgogICAgICAgIHJldHVybiAnLCcuam9pbihzZWxmLmFsbF9wYXRoX2xpc3QpOwoKICAgIGRlZiBmaW5kX2FsbF9wYXRoKHNlbGYsIGN1cl9ub2RlLCBlbmRfbm9kZSwgcGF0aCk6CiAgICAgICAgcGF0aCArPSBjdXJfbm9kZTsKCiAgICAgICAgaWYgKCBjdXJfbm9kZSA9PSBlbmRfbm9kZSApOgogICAgICAgICAgICBzZWxmLmFsbF9wYXRoX2xpc3QuYXBwZW5kKHBhdGgpOwogICAgICAgICAgICByZXR1cm47CgogICAgICAgIGlmICggbm90IHNlbGYuZ3JhcGhbY3VyX25vZGVdICk6CiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5ncmFwaFtjdXJfbm9kZV06CiAgICAgICAgICAgIHNlbGYuZmluZF9hbGxfcGF0aChub2RlLCBlbmRfbm9kZSwgcGF0aCk7CgoKCmdyYXBoID0gR3JhcGgoKTsKCnN0YXNoID0gJzF7MiwzfTR7NSw2fTcnOwoKc2VwID0gWyd7JywgJywnLCAnfSddOwppbml0X25vZGUgPSBlbmRfbm9kZSA9IE5vbmU7CnBhcmVudHMgPSB7fTsKCmRlZiBkZXBsb3koaSA9IDAsIG5vZGUgPSBOb25lLCBkZWVwID0gMCk6CiAgICBnbG9iYWwgc3Rhc2gsIHNlcCwgaW5pdF9ub2RlLCBlbmRfbm9kZSwgcGFyZW50czsKCiAgICBwYXJlbnQsIG5vZGUgPSBub2RlLCAnJzsKICAgIGJhY2sgPSBGYWxzZTsKCiAgICB3aGlsZSAoIGkgPCBsZW4oc3Rhc2gpICk6CiAgICAgICAgY2ggPSBzdGFzaFtpXTsKCiAgICAgICAgaWYgKCBjaCBub3QgaW4gc2VwICk6CiAgICAgICAgICAgIG5vZGUgKz0gY2g7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGVsaWYgKCBjaCA9PSBzZXBbMF0gKToKICAgICAgICAgICAgaWYgKCBpbml0X25vZGUgaXMgTm9uZSApOgogICAgICAgICAgICAgICAgaW5pdF9ub2RlID0gbm9kZTsKCiAgICAgICAgICAgIGlmICggcGFyZW50IGlzIG5vdCBOb25lICk6CiAgICAgICAgICAgICAgICBncmFwaC5hZGRfbm9kZShwYXJlbnQsIG5vZGUpOwoKICAgICAgICAgICAgaSwgcGFyZW50c1tkZWVwICsgMV0gPSBkZXBsb3koaSArIDEsIG5vZGUsIGRlZXAgKyAxKTsKCiAgICAgICAgICAgIGJhY2sgPSBUcnVlOwogICAgICAgICAgICBub2RlID0gJyc7CgogICAgICAgIGVsaWYgKCBjaCA9PSBzZXBbMV0gKToKICAgICAgICAgICAgaWYgKCBpbml0X25vZGUgaXMgTm9uZSApOgogICAgICAgICAgICAgICAgaW5pdF9ub2RlID0gbm9kZTsKCiAgICAgICAgICAgIGlmIGJhY2s6CiAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBwYXJlbnRzW2RlZXAgKyAxXToKICAgICAgICAgICAgICAgICAgICBncmFwaC5hZGRfbm9kZShpdGVtLCBub2RlKTsKICAgICAgICAgICAgICAgIGRlbCBwYXJlbnRzW2RlZXAgKyAxXTsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGdyYXBoLmFkZF9ub2RlKHBhcmVudCwgbm9kZSk7CgogICAgICAgICAgICBwYXJlbnRzW2RlZXBdID0gW107CiAgICAgICAgICAgIHBhcmVudHNbZGVlcF0uYXBwZW5kKG5vZGUpOwoKICAgICAgICAgICAgbm9kZSA9ICcnOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBlbGlmICggY2ggPT0gc2VwWzJdICk6CiAgICAgICAgICAgIGlmIGJhY2s6CiAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBwYXJlbnRzW2RlZXAgKyAxXToKICAgICAgICAgICAgICAgICAgICBncmFwaC5hZGRfbm9kZShpdGVtLCBub2RlKTsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGdyYXBoLmFkZF9ub2RlKHBhcmVudCwgbm9kZSk7CgogICAgICAgICAgICBwYXJlbnRzW2RlZXBdLmFwcGVuZChub2RlKTsKCiAgICAgICAgICAgIHJldHVybiBpICsgMSwgcGFyZW50c1tkZWVwXTsKCgogICAgZW5kX25vZGUgPSBub2RlOwogICAgZm9yIGl0ZW0gaW4gcGFyZW50c1tkZWVwICsgMV06CiAgICAgICAgZ3JhcGguYWRkX25vZGUoaXRlbSwgbm9kZSk7CgoKCmRlcGxveSgpOwoKb3V0X3N0ciA9IGdyYXBoLmVjaG8oaW5pdF9ub2RlLCBlbmRfbm9kZSk7CnByaW50KG91dF9zdHIpOyAgIyAgYWJjZGVmZ3h5d2VyLGFiY2RlaHh5d2VyLGFic3R1dmR3ZXIsYWJzdHp4ZHdlcg==