using
System;
public
class
Suffix
{
public
class
SuffixTrieNode
{
static
readonly
int
MAX_CHAR = 26;
public
SuffixTrieNode[] children =
new
SuffixTrieNode[MAX_CHAR];
public
SuffixTrieNode()
{
for
(
int
i = 0; i < MAX_CHAR; i++)
children[i] =
null
;
}
public
void
insertSuffix(String s)
{
if
(s.Length > 0)
{
char
cIndex = (
char
) (s[0] -
'a'
);
if
(children[cIndex] ==
null
)
children[cIndex] =
new
SuffixTrieNode();
children[cIndex].insertSuffix(s.Substring(1));
}
}
}
public
class
Suffix_trie
{
static
readonly
int
MAX_CHAR = 26;
public
SuffixTrieNode root;
public
Suffix_trie(String s)
{
root =
new
SuffixTrieNode();
for
(
int
i = 0; i < s.Length; i++)
root.insertSuffix(s.Substring(i));
}
public
int
_countNodesInTrie(SuffixTrieNode node)
{
if
(node ==
null
)
return
0;
int
count = 0;
for
(
int
i = 0; i < MAX_CHAR; i++)
{
if
(node.children[i] !=
null
)
count += _countNodesInTrie(node.children[i]);
}
return
(1 + count);
}
public
int
countNodesInTrie()
{
return
_countNodesInTrie(root);
}
}
static
int
countDistinctSubstring(String str)
{
Suffix_trie sTrie =
new
Suffix_trie(str);
return
sTrie.countNodesInTrie();
}
public
static
void
Main(String []args)
{
String str =
"ababa"
;
Console.WriteLine(
"Count of distinct substrings is "
+ countDistinctSubstring(str));
}
}