//O(n)
 private Suffix[] CreateInitializedSuffixArray(byte[] text)
 {
     int Length = text.Length;
     Suffix[] suffixes = new Suffix[Length];
     for (int i = 0; i < suffixes.Length; i++) //O(n)
     {
         suffixes[i] = new Suffix();
         suffixes[i].Index = i;
         suffixes[i].Rank = (int)(text[i]);
         suffixes[i].NextRank = (i + 1) < Length ? (int)(text[i + 1]) : -1;
                              //((i+1) < n)? (txt[i + 1] - 'a'): -1;
     }
     return suffixes;
 }
        private void CountSort(Suffix[] suffixes, bool sortRank)
        {
            var count = new List<Suffix>[suffixes.Length + 256]; //O(1)
            int count_length = count.Length;

            for (int i = 0; i < count_length; i++) //O(n)
            {
                count[i] = new List<Suffix>(); //O(1)
            }

            foreach (var suffix in suffixes)//O(n)
            {
                int ind = (sortRank == true) ? suffix.Rank : (suffix.NextRank + 1);//O(1)
                count[ind].Add(suffix);//O(1)
            }

            int index = 0; //O(1)

            foreach (var suffixList in count) //O(n)------> o(n^2)
            {
                if (suffixList.Count == 0) //O(1)
                    continue;   //O(1)

                foreach (var suffix in suffixList) //O(n)
                {
                    suffixes[index++] = suffix; //O(1)
                }
            }
        }