public void SAAllABTest()
 {
     for (int n = 1; n <= 100; n++)
     {
         var s = new int[n];
         for (int i = 0; i < n; i++)
         {
             s[i] = (i % 2);
         }
         var sa = SaNaive(s);
         StringLib.SuffixArray(s).Should().Equal(sa);
         StringLib.SuffixArray(s, 3).Should().Equal(sa);
     }
     for (int n = 1; n <= 100; n++)
     {
         var s = new int[n];
         for (int i = 0; i < n; i++)
         {
             s[i] = 1 - (i % 2);
         }
         var sa = SaNaive(s);
         StringLib.SuffixArray(s).Should().Equal(sa);
         StringLib.SuffixArray(s, 3).Should().Equal(sa);
     }
 }
        public void Empty()
        {
            StringLib.SuffixArray("").Should().Equal();
            StringLib.SuffixArray(Array.Empty <int>()).Should().Equal();

            StringLib.ZAlgorithm("").Should().Equal();
            StringLib.ZAlgorithm(Array.Empty <int>()).Should().Equal();
        }
 public void SAAllATest()
 {
     for (int n = 1; n <= 100; n++)
     {
         var s  = Enumerable.Repeat(10, n).ToArray();
         var sa = SaNaive(s);
         StringLib.SuffixArray(s).Should().Equal(sa);
         StringLib.SuffixArray(s, 10).Should().Equal(sa);
         StringLib.SuffixArray(s, 12).Should().Equal(sa);
     }
 }
 public void SALCPNaive()
 {
     for (int n = 1; n <= 5; n++)
     {
         int m = 1;
         for (int i = 0; i < n; i++)
         {
             m *= 4;
         }
         for (int f = 0; f < m; f++)
         {
             var s     = new int[n];
             int g     = f;
             int max_c = 0;
             for (int i = 0; i < n; i++)
             {
                 s[i]  = g % 4;
                 max_c = Math.Max(max_c, s[i]);
                 g    /= 4;
             }
             var sa = SaNaive(s);
             StringLib.SuffixArray(s).Should().Equal(sa);
             StringLib.SuffixArray(s, max_c).Should().Equal(sa);
             StringLib.LCPArray(s, sa).Should().Equal(LcpNaive(s, sa));
         }
     }
     for (int n = 1; n <= 10; n++)
     {
         int m = 1;
         for (int i = 0; i < n; i++)
         {
             m *= 2;
         }
         for (int f = 0; f < m; f++)
         {
             var s     = new int[n];
             int g     = f;
             int max_c = 0;
             for (int i = 0; i < n; i++)
             {
                 s[i]  = g % 2;
                 max_c = Math.Max(max_c, s[i]);
                 g    /= 2;
             }
             var sa = SaNaive(s);
             StringLib.SuffixArray(s).Should().Equal(sa);
             StringLib.SuffixArray(s, max_c).Should().Equal(sa);
             StringLib.LCPArray(s, sa).Should().Equal(LcpNaive(s, sa));
         }
     }
 }
        public void SA()
        {
            var s = "missisippi";

            var sa = StringLib.SuffixArray(s);

            var answer = new[] {
                "i",           // 9
                "ippi",        // 6
                "isippi",      // 4
                "issisippi",   // 1
                "missisippi",  // 0
                "pi",          // 8
                "ppi",         // 7
                "sippi",       // 5
                "sisippi",     // 3
                "ssisippi",    // 2
            };

            sa.Should().HaveCount(answer.Length);
            for (int i = 0; i < sa.Length; i++)
            {
                s[sa[i]..].Should().Be(answer[i]);