public void InitializeTest()
 {
     Assert.DoesNotThrow(() => StringAlgorithm.SuffixArray("".AsSpan()));
     Assert.DoesNotThrow(() => StringAlgorithm.SuffixArray <int>(Array.Empty <int>()));
     Assert.DoesNotThrow(() => StringAlgorithm.ZAlgorithm("".AsSpan()));
     Assert.DoesNotThrow(() => StringAlgorithm.ZAlgorithm <int>(Array.Empty <int>()));
 }
        public void EmptyTest()
        {
            Assert.That(StringAlgorithm.SuffixArray("".AsSpan()).Length, Is.Zero);
            Assert.That(StringAlgorithm.SuffixArray <int>(Array.Empty <int>()).Length, Is.Zero);

            Assert.That(StringAlgorithm.ZAlgorithm("".AsSpan()).Length, Is.Zero);
            Assert.That(StringAlgorithm.ZAlgorithm <int>(Array.Empty <int>()).Length, Is.Zero);
        }
Example #3
0
        public static void Solve()
        {
            var S      = Console.ReadLine();
            var sa     = StringAlgorithm.SuffixArray(S);
            var answer = (long)S.Length * (S.Length + 1) / 2;

            answer = StringAlgorithm.LongestCommonPrefixArray <char>(S, sa)
                     .Aggregate(answer, (sum, x) => sum - x);

            Console.WriteLine(answer);
        }
Example #4
0
        public static void Solve()
        {
            var S      = Scanner.Scan <string>();
            var sa     = StringAlgorithm.SuffixArray(S);
            var answer = (long)S.Length * (S.Length + 1) / 2;

            foreach (var x in StringAlgorithm.LCPArray(S, sa))
            {
                answer -= x;
            }
            Console.WriteLine(answer);
        }
Example #5
0
        public static void Solve()
        {
            var N   = Scanner.Scan <int>();
            var S   = Scanner.Scan <string>();
            var sa  = StringAlgorithm.SuffixArray(S);
            var lcp = StringAlgorithm.LongestCommonPrefixArray(S, sa);

            var answer = new long[N];

            for (var i = 0; i < N; i++)
            {
                answer[i] = N - i;
            }

            for (var k = 0; k < 2; k++)
            {
                var stack = new Stack <(long H, long W)>();
                var s     = 0L;
                for (var i = 0; i < N - 1; i++)
                {
                    var w = 1L;
                    while (stack.TryPeek(out var top) && top.H > lcp[i])
                    {
                        w += top.W;
                        s -= top.H * top.W;
                        stack.Pop();
                    }

                    s += lcp[i] * w;
                    stack.Push((lcp[i], w));
                    answer[sa[i + 1]] += s;
                }

                Array.Reverse(sa);
                Array.Reverse(lcp);
            }

            Console.WriteLine(string.Join("\n", answer));
        }
        public void SuffixArrayTest()
        {
            const string str    = "missisippi";
            var          sa     = StringAlgorithm.SuffixArray(str);
            var          answer = new[]
            {
                "i",          // 9
                "ippi",       // 6
                "isippi",     // 4
                "issisippi",  // 1
                "missisippi", // 0
                "pi",         // 8
                "ppi",        // 7
                "sippi",      // 5
                "sisippi",    // 3
                "ssisippi"    // 2
            };

            Assert.That(sa.Length, Is.EqualTo(answer.Length));
            for (var i = 0; i < sa.Length; i++)
            {
                Assert.That(str[sa[i]..], Is.EqualTo(answer[i]));