import
java.util.*;
class
Trie {
private
static
final
int
ALPHABET_SIZE
=
256
;
private
static
class
DLLNode {
String data;
DLLNode prev;
DLLNode next;
DLLNode(String data)
{
this
.data = data;
this
.prev =
null
;
this
.next =
null
;
}
}
private
static
class
TrieNode {
TrieNode[] children;
boolean
isLeaf;
DLLNode LLptr;
TrieNode()
{
children =
new
TrieNode[ALPHABET_SIZE];
isLeaf =
false
;
LLptr =
null
;
}
}
private
static
DLLNode push(DLLNode headRef,
String newData)
{
DLLNode newNode =
new
DLLNode(
newData);
newNode.next
= headRef;
if
(headRef !=
null
) {
headRef.prev = newNode;
}
headRef = newNode;
return
headRef;
}
private
static
DLLNode deleteNode(DLLNode headRef,
DLLNode delNode)
{
if
(headRef ==
null
|| delNode ==
null
) {
return
headRef;
}
if
(headRef == delNode) {
headRef = delNode.next;
}
if
(delNode.next !=
null
) {
delNode.next.prev = delNode.prev;
}
if
(delNode.prev !=
null
) {
delNode.prev.next = delNode.next;
}
return
headRef;
}
private
static
TrieNode getNewTrieNode()
{
TrieNode pNode =
new
TrieNode();
pNode.isLeaf =
false
;
pNode.LLptr =
null
;
return
pNode;
}
static
DLLNode insert(TrieNode root, String key,
DLLNode head)
{
TrieNode pCrawl
= root;
for
(
int
level =
0
; level < key.length(); level++) {
int
index = (
int
)key.charAt(level);
if
(pCrawl.children[index] ==
null
) {
pCrawl.children[index] = getNewTrieNode();
}
pCrawl = pCrawl.children[index];
}
if
(pCrawl.isLeaf) {
if
(pCrawl.LLptr !=
null
) {
head = deleteNode(head, pCrawl.LLptr);
}
pCrawl.LLptr =
null
;
}
else
{
pCrawl.isLeaf =
true
;
head = push(head, key);
pCrawl.LLptr = head;
}
return
head;
}
public
static
void
main(String[] args)
{
String[] urls = {
};
TrieNode root = getNewTrieNode();
DLLNode head =
null
;
for
(String url : urls) {
head = insert(root, url, head);
}
System.out.println(head.data);
}
}