#include <iostream>
#include <list>
#include <stack>
#include <map>
#include <vector>
using namespace std;
class Graph
{
Graph (){}
int V;
vector < list <int> > adj;
void topologicalSortUtil(int v, bool visited[], stack<int> &Stack);
public:
Graph(int V);
void addEdge(int v, int w);
void topologicalSort();
};
Graph::Graph(int V)
{
this->V = V;
this->adj.resize (V, list <int> ());
}
void Graph::addEdge(int v, int w)
{
if (v > V)
Graph (v);
adj[v].push_back(w);
}
void Graph::topologicalSortUtil(int v, bool visited[], stack<int> &Stack)
{
visited[v] = true;
list<int>::iterator i;
for (i = adj[v].begin(); i != adj[v].end(); ++i)
if (!visited[*i])
topologicalSortUtil(*i, visited, Stack);
Stack.push(v);
}
void Graph::topologicalSort()
{
stack<int> Stack;
bool *visited = new bool[V];
for (int i = 0; i < V; i++)
visited[i] = false;
for (int i = 0; i < V; i++)
if (visited[i] == false)
topologicalSortUtil(i, visited, Stack);
while (Stack.empty() == false)
{
cout << Stack.top() << " ";
Stack.pop();
}
}
int main()
{
char alf [26];
map <char, int> sym;
for (char a = 'a' ; a <= 'z' ; a ++)
alf [a - 'a'] = a;
Graph g (0);
int n, k = 0;
cin >> n;
string prev;
cin >> prev;
for (int i = 0 ; i < n - 1 ; i ++)
{
string curr;
cin >> curr;
for (size_t i = 0 ; i < min (prev.size (), curr.size ()) ; i ++)
if (prev [i] != curr [i])
{
if (sym.find (prev [i]) == sym.end ())
{
sym [prev [i]] = k ++;
}
if (sym.find (curr [i]) == sym.end ())
{
sym [curr [i]] = k ++;
}
g.addEdge (sym [prev [i]], sym [curr [i]]);
}
}
cout << "Following is a Topological Sort of the given graph \n";
g.topologicalSort();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHN0YWNrPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEdyYXBoCnsKICAgIEdyYXBoICgpe30KICAgIGludCBWOwogICAgCiAgICB2ZWN0b3IgPCBsaXN0IDxpbnQ+ID4gYWRqOwogICAgCiAgICB2b2lkIHRvcG9sb2dpY2FsU29ydFV0aWwoaW50IHYsIGJvb2wgdmlzaXRlZFtdLCBzdGFjazxpbnQ+ICZTdGFjayk7CnB1YmxpYzoKICAgIEdyYXBoKGludCBWKTsKICAgIAogCiAgICB2b2lkIGFkZEVkZ2UoaW50IHYsIGludCB3KTsKIAogICAgdm9pZCB0b3BvbG9naWNhbFNvcnQoKTsKfTsKIApHcmFwaDo6R3JhcGgoaW50IFYpCnsKICAgIHRoaXMtPlYgPSBWOwogICAgdGhpcy0+YWRqLnJlc2l6ZSAoViwgbGlzdCA8aW50PiAoKSk7Cn0KIAp2b2lkIEdyYXBoOjphZGRFZGdlKGludCB2LCBpbnQgdykKewogICAgaWYgKHYgPiBWKQogICAgICAgIEdyYXBoICh2KTsgICAgICAgIAogICAgYWRqW3ZdLnB1c2hfYmFjayh3KTsKfQogCnZvaWQgR3JhcGg6OnRvcG9sb2dpY2FsU29ydFV0aWwoaW50IHYsIGJvb2wgdmlzaXRlZFtdLCBzdGFjazxpbnQ+ICZTdGFjaykKewogICAgdmlzaXRlZFt2XSA9IHRydWU7CiAKICAgIGxpc3Q8aW50Pjo6aXRlcmF0b3IgaTsKICAgIGZvciAoaSA9IGFkalt2XS5iZWdpbigpOyBpICE9IGFkalt2XS5lbmQoKTsgKytpKQogICAgICAgIGlmICghdmlzaXRlZFsqaV0pCiAgICAgICAgICAgIHRvcG9sb2dpY2FsU29ydFV0aWwoKmksIHZpc2l0ZWQsIFN0YWNrKTsKIAogICAgU3RhY2sucHVzaCh2KTsKfQogCnZvaWQgR3JhcGg6OnRvcG9sb2dpY2FsU29ydCgpCnsKICAgIHN0YWNrPGludD4gU3RhY2s7CiAKICAgIGJvb2wgKnZpc2l0ZWQgPSBuZXcgYm9vbFtWXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVjsgaSsrKQogICAgICAgIHZpc2l0ZWRbaV0gPSBmYWxzZTsKIAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWOyBpKyspCiAgICAgIGlmICh2aXNpdGVkW2ldID09IGZhbHNlKQogICAgICAgIHRvcG9sb2dpY2FsU29ydFV0aWwoaSwgdmlzaXRlZCwgU3RhY2spOwogCiAgICB3aGlsZSAoU3RhY2suZW1wdHkoKSA9PSBmYWxzZSkKICAgIHsKICAgICAgICBjb3V0IDw8IFN0YWNrLnRvcCgpIDw8ICIgIjsKICAgICAgICBTdGFjay5wb3AoKTsKICAgIH0KfQogCmludCBtYWluKCkKewogICAgY2hhciBhbGYgWzI2XTsKICAgIG1hcCA8Y2hhciwgaW50PiBzeW07CiAgICBmb3IgKGNoYXIgYSA9ICdhJyA7IGEgPD0gJ3onIDsgYSArKykKICAgICAgICBhbGYgW2EgLSAnYSddID0gYTsKICAgIEdyYXBoIGcgKDApOwogICAgaW50IG4sIGsgPSAwOwogICAgY2luID4+IG47CiAgICBzdHJpbmcgcHJldjsKICAgIGNpbiA+PiBwcmV2OwogICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbiAtIDEgOyBpICsrKQogICAgewogICAgICAgIHN0cmluZyBjdXJyOwogICAgICAgIGNpbiA+PiBjdXJyOwogICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1pbiAocHJldi5zaXplICgpLCBjdXJyLnNpemUgKCkpIDsgaSArKykKICAgICAgICAgICAgaWYgKHByZXYgW2ldICE9IGN1cnIgW2ldKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3ltLmZpbmQgKHByZXYgW2ldKSA9PSBzeW0uZW5kICgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN5bSBbcHJldiBbaV1dID0gayArKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzeW0uZmluZCAoY3VyciBbaV0pID09IHN5bS5lbmQgKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3ltIFtjdXJyIFtpXV0gPSBrICsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZy5hZGRFZGdlIChzeW0gW3ByZXYgW2ldXSwgc3ltIFtjdXJyIFtpXV0pOwogICAgICAgICAgICB9CiAgICB9CiAgICBjb3V0IDw8ICJGb2xsb3dpbmcgaXMgYSBUb3BvbG9naWNhbCBTb3J0IG9mIHRoZSBnaXZlbiBncmFwaCBcbiI7CiAgICBnLnRvcG9sb2dpY2FsU29ydCgpOwogCiAgICByZXR1cm4gMDsKfQ==