#include <bits/stdc++.h>
struct Node{
Node* Lists[256];
bool flag = false;
bool checkFlag()
{
return flag;
}
bool isPresent(char ch)
{
return (Lists[ch-0]!=NULL);
}
void createNewNode(char ch, Node* node)
{
Lists[ch-0]=node;
}
Node* nextNode(char ch)
{
return Lists[ch-0];
}
void setFlag()
{
flag=true;
}
};
class Trie{
public:
Node* root;
Trie()
{
root = new Node;
}
void insert(string word)
{
Node* node = root;
for(int i = 0; i<word.size(); i++)
{
if(!node->isPresent(word[i]))
{
node->createNewNode(word[i], new Node());
}
node = node->nextNode(word[i]);
}
node->setFlag();
}
void check(string word, string &largest)
{
Node* node = root;
bool got = true;
int i;
for(i = 0;i<word.size();i++)
{
node = node->nextNode(word[i]);
if(node->checkFlag())
continue;
else
{
got = false;
break;
}
}
if(i==word.size() && got==true)
{
if(word.size()>largest.size())
largest = word;
else if(word.size()==largest.size())
{
int comp = largest.compare(word);
if(comp>0)
largest = word;
}
}
}
};
string completeString(int n, vector<string> &a){
// Write your code here.
Trie trie;
string largest="";
for(int i=0;i<n;i++)
{
trie.insert(a[i]);
}
for(int i=0;i<n;i++)
{
trie.check(a[i], largest);
}
if(largest.size()!=0)
return largest;
return "None";
}