#include <iostream>
#include <list>
#include <stack>
#include <map>
#include <vector>
#include <string>
using namespace std;
class Graph
{
public:
Graph (){}
int V = 0;
vector < list <int> > adj;
void topologicalSortUtil(int v, bool visited[], stack<int> &Stack);
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 + 1 > V)
Graph (v + 1);
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 ()
{
map <char, int> sym;
Graph g;
cout << "make graph-Syc\n";
int n, k = 0;
cin >> n;
cout << n << "\n";
string prev;
string curr;
cin >> curr;
cout << "Start - " << curr << "\n";
for (int i = 0 ; i < n - 1 ; i ++)
{
cout << "In1\n";
cin >> curr;
cout << "New String: " << "\n";
cout << curr << "\n";
if (prev.size () != curr.size ())
{
prev = curr;
continue;
}
for (int i = 0 ; i < prev.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 << k << "\n";
}
prev = curr;
}
cout << "Following is a Topological Sort of the given graph \n";
g.topologicalSort();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHN0YWNrPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEdyYXBoCnsKcHVibGljOgogICAgR3JhcGggKCl7fQogICAgaW50IFYgPSAwOwogICAgCiAgICB2ZWN0b3IgPCBsaXN0IDxpbnQ+ID4gYWRqOwogICAgCiAgICB2b2lkIHRvcG9sb2dpY2FsU29ydFV0aWwoaW50IHYsIGJvb2wgdmlzaXRlZFtdLCBzdGFjazxpbnQ+ICZTdGFjayk7CgogICAgR3JhcGgoaW50IFYpOwogICAgCiAKICAgIHZvaWQgYWRkRWRnZShpbnQgdiwgaW50IHcpOwogCiAgICB2b2lkIHRvcG9sb2dpY2FsU29ydCgpOwp9OwogCkdyYXBoOjpHcmFwaChpbnQgVikKewogICAgdGhpcy0+ViA9IFY7CiAgICB0aGlzLT5hZGoucmVzaXplIChWLCBsaXN0IDxpbnQ+ICgpKTsKfQogCnZvaWQgR3JhcGg6OmFkZEVkZ2UoaW50IHYsIGludCB3KQp7CiAgICBpZiAodiArIDEgPiBWKQogICAgICAgIEdyYXBoICh2ICsgMSk7ICAgICAgICAKICAgIGFkalt2XS5wdXNoX2JhY2sodyk7Cn0KIAp2b2lkIEdyYXBoOjp0b3BvbG9naWNhbFNvcnRVdGlsKGludCB2LCBib29sIHZpc2l0ZWRbXSwgc3RhY2s8aW50PiAmU3RhY2spCnsKICAgIHZpc2l0ZWRbdl0gPSB0cnVlOwogCiAgICBsaXN0PGludD46Oml0ZXJhdG9yIGk7CiAgICBmb3IgKGkgPSBhZGpbdl0uYmVnaW4oKTsgaSAhPSBhZGpbdl0uZW5kKCk7ICsraSkKICAgICAgICBpZiAoIXZpc2l0ZWRbKmldKQogICAgICAgICAgICB0b3BvbG9naWNhbFNvcnRVdGlsKCppLCB2aXNpdGVkLCBTdGFjayk7CiAKICAgIFN0YWNrLnB1c2godik7Cn0KIAp2b2lkIEdyYXBoOjp0b3BvbG9naWNhbFNvcnQoKQp7CiAgICBzdGFjazxpbnQ+IFN0YWNrOwogCiAgICBib29sICp2aXNpdGVkID0gbmV3IGJvb2xbVl07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IFY7IGkrKykKICAgICAgICB2aXNpdGVkW2ldID0gZmFsc2U7CiAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVjsgaSsrKQogICAgICBpZiAodmlzaXRlZFtpXSA9PSBmYWxzZSkKICAgICAgICB0b3BvbG9naWNhbFNvcnRVdGlsKGksIHZpc2l0ZWQsIFN0YWNrKTsKIAogICAgd2hpbGUgKFN0YWNrLmVtcHR5KCkgPT0gZmFsc2UpCiAgICB7CiAgICAgICAgY291dCA8PCBTdGFjay50b3AoKSA8PCAiICI7CiAgICAgICAgU3RhY2sucG9wKCk7CiAgICB9Cn0KIAppbnQgbWFpbiAoKQp7CiAgICBtYXAgPGNoYXIsIGludD4gc3ltOwogICAgR3JhcGggZzsKICAgIGNvdXQgPDwgIm1ha2UgZ3JhcGgtU3ljXG4iOwogICAgaW50IG4sIGsgPSAwOwogICAgY2luID4+IG47CiAgICBjb3V0IDw8IG4gPDwgIlxuIjsKICAgIHN0cmluZyBwcmV2OwogICAgc3RyaW5nIGN1cnI7CiAgICBjaW4gPj4gY3VycjsKICAgIGNvdXQgPDwgIlN0YXJ0IC0gIiA8PCBjdXJyIDw8ICJcbiI7CiAgICBmb3IgKGludCBpID0gMCA7IGkgPCBuIC0gMSA7IGkgKyspCiAgICB7CiAgICAJY291dCA8PCAiSW4xXG4iOwogICAgICAgIGNpbiA+PiBjdXJyOwogICAgICAgIGNvdXQgPDwgIk5ldyBTdHJpbmc6ICIgPDwgIlxuIjsKICAgICAgICBjb3V0IDw8IGN1cnIgPDwgIlxuIjsKICAgICAgICBpZiAocHJldi5zaXplICgpICE9IGN1cnIuc2l6ZSAoKSkKICAgICAgICB7CiAgICAgICAgCXByZXYgPSBjdXJyOwogICAgICAgIAljb250aW51ZTsKICAgIAl9CiAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgcHJldi5zaXplICgpIDsgaSArKykKICAgICAgICAgICAgaWYgKHByZXYgW2ldICE9IGN1cnIgW2ldKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3ltLmZpbmQgKHByZXYgW2ldKSA9PSBzeW0uZW5kICgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN5bSBbcHJldiBbaV1dID0gayArKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzeW0uZmluZCAoY3VyciBbaV0pID09IHN5bS5lbmQgKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3ltIFtjdXJyIFtpXV0gPSBrICsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZy5hZGRFZGdlIChzeW0gW3ByZXYgW2ldXSwgc3ltIFtjdXJyIFtpXV0pOwogICAgICAgICAgICAgICAgY291dCA8PCBrIDw8ICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICBwcmV2ID0gY3VycjsKICAgIH0KICAgIGNvdXQgPDwgIkZvbGxvd2luZyBpcyBhIFRvcG9sb2dpY2FsIFNvcnQgb2YgdGhlIGdpdmVuIGdyYXBoIFxuIjsKICAgIGcudG9wb2xvZ2ljYWxTb3J0KCk7CiAKICAgIHJldHVybiAwOwp9