#1479. [Template] SA

内存限制:512 MiB 时间限制:3000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: hwpvector

题目描述

这是一道模板题

读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置。位置编号为 11nn

两个字符按照 ASCII 码比较。

输入格式

一行一个长度为 nn 的仅包含大小写英文字母或数字的字符串。

输出格式

第一行 nn 个整数,第 ii 个整数为 SA[i]\text{SA}[i]

样例

样例输入

ababa

样例输出

5 3 1 4 2

数据范围与提示

1n1051\le n \le 10^5

Hint:

  • 考虑如果使用 Hash 在单次 O(logn)O(\log n) 的复杂度内求某一字符串的任意子串的 LCP(最长公共前缀)
  • 考虑使用 std::sort 进行排序
  • 总复杂度为 O(nlog2n)O(n \log^2 n)
  • 实际上,还有 O(nlogn)O(n \log n)O(n)O(n) 的做法。这里不再展开。