#include <bits/stdc++.h>
using
namespace
std;
void
addEdge(vector<
int
> adj[],
char
u,
char
v)
{
adj[u -
'a'
].push_back(v -
'a'
);
}
void
dfs(vector<
int
> adj[], vector<
int
>& col,
int
curr,
bool
& isCyclic)
{
col[curr] = 1;
for
(
int
i = 0; i < adj[curr].size(); i++) {
int
x = adj[curr][i];
if
(col[x] == 1) {
isCyclic =
true
;
return
;
}
else
if
(col[x] == 0) {
dfs(adj, col, x, isCyclic);
}
}
col[curr] = 2;
}
bool
checkCycle(vector<
int
> adj[], vector<
int
> col,
int
k)
{
bool
isCyclic =
false
;
for
(
int
i = 0; i < k; i++) {
if
(col[i] == 0) {
dfs(adj, col, i, isCyclic);
}
}
return
isCyclic;
}
void
topologicalSortUtil(vector<
int
> adj[],
int
u,
bool
visited[], stack<
int
>& st)
{
visited[u] =
true
;
for
(
int
i = 0; i < adj[u].size(); i++) {
int
v = adj[u][i];
if
(!visited[v]) {
topologicalSortUtil(adj, v, visited, st);
}
}
st.push(u);
}
void
topologicalSort(vector<
int
> adj[],
int
V)
{
bool
visited[V];
stack<
int
> st;
for
(
int
i = 0; i < V; i++) {
visited[i] =
false
;
}
for
(
int
i = 0; i < V; i++) {
if
(!visited[i]) {
topologicalSortUtil(adj, i, visited, st);
}
}
while
(!st.empty()) {
cout <<
char
(st.top() +
'a'
) <<
" "
;
st.pop();
}
}
void
printOrder(string words[],
int
n)
{
vector<
int
> frq(26, 0);
int
k = 0;
for
(
int
i = 0; i < n; i++) {
string s = words[i];
for
(
int
j = 0; j < s.size(); j++) {
frq[s[j] - 97]++;
if
(frq[s[j] - 97] == 1)
k++;
}
}
vector<
int
> adj[k];
for
(
int
i = 0; i < n - 1; i++) {
string word1 = words[i];
string word2 = words[i + 1];
int
j = 0;
while
(j < word1.length() && j < word2.length()) {
if
(word1[j] != word2[j]) {
addEdge(adj, word1[j], word2[j]);
break
;
}
j++;
}
}
vector<
int
> col(k, 0);
if
(checkCycle(adj, col, k)) {
cout <<
"Valid Order is not possible\n"
;
return
;
}
topologicalSort(adj, k);
}
int
main()
{
string words[]
= {
"baa"
,
"abcd"
,
"abca"
,
"cab"
,
"cad"
};
int
n =
sizeof
(words) /
sizeof
(words[0]);
printOrder(words, n);
return
0;
}