Пример #1
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);
        }
Пример #2
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));
        }