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); }
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)); }